본문 바로가기

웹 개발/쇼핑몰 프로젝트(개인)

쇼핑몰 만들기(2)-관리자 로그인,로그아웃

728x90
 

쇼핑몰 만들기(1)-관리자페이지

두번째 개인 프로젝트로 쇼핑몰을 만드려고 한다. 일단은 관리자페이지 먼저 구상을 조금씩 해놓고 코드를 구현할 것이다. 현재까지 구상한 마인드 맵이다 로그인, 로그아웃 기능 관리자들을

broad-backend.tistory.com

 

처음으로는 관리자 페이지를 만드려고 한다.

그래서 관리자들이 로그인 할 수 있는 로그인 기능을 만들 것이다.

empLoginForm, empLoginAction, empLogoutAction 총 3개의 jsp로 구성할 것이고,

로그인이 되면 empList인 관리자들의 리스트를 출력하는 jsp페이지로 이동할 것이다.

 

 

일단 처음에 session의 loginEmp가 비어있지 않다면(= 로그인이 되어있는 것) empList(관리자 리스트 출력페이지)로 redirect 한다.

 

그리고 errMsg 변수를 선언해 로그인이 실패한 경우 등 메시지를 같이 보내면 요청값으로 받을 수 있게 한다.

 

사용자가 보는 View 단에는 errMsg가 있을때 errMsg를 함께 보이게 했고

form으로 id, pw값을 입력 받도록 했다

empLoginForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
	/* 로그인 인증 분기*/
	// 세션 변수 이름 - loginEmp
	
	if(session.getAttribute("loginEmp") != null) {
		response.sendRedirect("/shop/emp/empList.jsp");
		return;
	}
%>
<%
	/* 에러 메시지 */
	String errMsg = request.getParameter("errMsg");
	
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>empLoginForm</title>
</head>
<body>
	<!-- 에러 메시지 출력 -->
	<%
		if(errMsg != null) {
	%>
			<div>
				<%=errMsg %>
			</div>
	<% 
		}
	%>
	<form action="/shop/emp/empLoginAction.jsp">
		<div>
		id: <input type="text" name="empId">
		</div>
		
		<div>
			pw: <input type="password" name="empPw">
		</div>
		<button type="submit">로그인</button>
	</form>
</body>
</html>

 

loginAction도 마찬가지로 loginEmp 세션이 비어있지 않으면 empList로 가게했다.

 

id,pw요청값을 받고 [DB]shop.emp에 SELECT쿼리를 보내 id,pw값이 있으면 empId와 empName, grade를 가져오게 했다.

그리고 다이어리 만들때는 ResultSet으로 했지만 ResultSet 같은 경우 JDBC API가 있어야만 값들을 확인할 수 있기때문에 이번 프로젝트부터는 Collection API인 ArrayList와 Map을 이용하도록 했다.

 

그리고 session.seAtrribute()메서드로 loginEmp라는 세션변수에 Map형태로 저장을 했다.

 

로그인에 실패하면 errMsg와 함께 empLoginForm으로 redirect하게 했다.

empLoginAction.jsp

<%@page import="java.net.URLEncoder"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
	/* 로그인 인증 분기*/
	// 세션 변수 이름 - loginEmp
	
	if(session.getAttribute("loginEmp") != null) {
		response.sendRedirect("/shop/emp/empList.jsp");
		return;
	}
%>
<%
	//DB 연결 및 초기화
	Class.forName("org.mariadb.jdbc.Driver");
	Connection conn = null;
	conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3307/shop", "root", "****");
	
	/* 로그인 하기 */
	
	// id, pw 요청값
	String empId = request.getParameter("empId");
	String empPw = request.getParameter("empPw");
	
	System.out.println("empLoginAction - empId = " + empId);
	System.out.println("empLoginAction - empPw = " + empPw);
		
	/*
		[DB]shop.emp에 empId, empPw 확인 SQL문 
		
		SELECT emp_id empId
		FROM emp
		WHERE active='ON' AND emp_id=? AND emp_pw = password(?)
	*/
	String loginSql = "SELECT emp_id empId, emp_name empName, grade FROM emp WHERE active='ON' AND emp_id=? AND emp_pw = password(?)";
	PreparedStatement loginStmt = null; 
	ResultSet loginRs = null;
	
	loginStmt = conn.prepareStatement(loginSql);
	loginStmt.setString(1, empId);
	loginStmt.setString(2, empPw);
	loginRs = loginStmt.executeQuery();
	
	
	if(loginRs.next()) {
		// 성공 -> /emp/empList.jsp
		System.out.println("로그인 성공");
		
		// 하나의 세션변수 안에 여러개의 값을 저장하기 위해 HashMap타입 사용
		HashMap<String, Object> loginEmp = new HashMap<String, Object>();
		loginEmp.put("empId", loginRs.getString("empId"));
		loginEmp.put("empName", loginRs.getString("empName"));
		loginEmp.put("grade", loginRs.getInt("grade"));
		
		session.setAttribute("loginEmp", loginEmp);
		
		// 디버깅(loginEmp 세션 변수)
		HashMap<String, Object> checkEmp = (HashMap<String, Object>)(session.getAttribute("loginEmp"));
		System.out.println((String)(checkEmp.get("empId")));
		System.out.println((String)(checkEmp.get("empName")));
		System.out.println((Integer)(checkEmp.get("grade")));
		
				
		response.sendRedirect("/shop/emp/empList.jsp");
	} else {
		// 실패 -> /emp/empLoginForm.jsp	
		System.out.println("로그인 실패");
		
		String errMsg = URLEncoder.encode("아이디와 비밀번호가 잘못되었습니다.", "utf-8");
		response.sendRedirect("/shop/emp/empLoginForm.jsp?errMsg=" + errMsg);
	}

	// 자원 반납
	loginRs.close();
	loginStmt.close();
	conn.close();
%>

 

로그아웃은 간단하다.

loginEmp가 있는 세션의 공간을 초기화하는 invalidate() 메서드를 사용했다.

그 후 empLoginForm으로 redirect하면 끝이다.

empLogoutAction.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
	session.invalidate(); // 세션 공간 초기화(포맷)
	
	response.sendRedirect("/shop/emp/empLoginForm.jsp");
%>

 

728x90