Spring MVC 3-6(로그인,로그아웃)

유동현·2022년 11월 22일
0

스프링MVC

목록 보기
10/13
post-thumbnail

LoginForm.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<%
   request.setCharacterEncoding("UTF-8");
   String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>LoginForm.jsp</title>
<link rel="stylesheet" type="text/css" href="<%=cp %>/css/main.css">
<style type="text/css">
	.desc
	{
		font-size: 5px;
		font-weight: normal;
		
	}
	
	.btn
	{
		height: 40px;
		width: 40%;
	}
	th
	{
		padding: 8px;
	}
</style>
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>

<script type="text/javascript">
	$(function()
	{
		$("#submitBtn").click(function()
		{
			//alert("로그인 버튼 클릭~!!!");
			
			if($("#id").val()=="" || $("#pw").val()=="")
				{
				
				$("#err").html("항목을 모두 입력해야 합니다.").css("display","inline");
				return;
				
				}
		
			$("#loginForm").submit();
		
		});
		
		
	});

</script>

</head>
<body>
<!--------------------------------------------------------------------
   #.29 LoginForm.jsp
   - 관리자, 일반사원 로그인 폼 페이지.
   - ID(employeeId), PW(ssn2) 입력 컨트롤 구성 및 관리자 여부 확인.
--------------------------------------------------------------------->   
   <div>
      <label>로그인</label>
      <hr>


      <!-- 콘텐츠 영역 -->
      <div id="content">
      
         <form action="login.action" method="post" id="loginForm">
            
            <table>
            	<tr>
            		<th>ID <span class="desc">(사원아이디)</span></th>
            		<td>
            			<input type="text" id="id" name="id" placeholder="아이디">
            			
            			<input type="checkbox" id="admin" name="admin" value="0" />
            			<label for="admin">관리자</label>
            		</td>
            	</tr>
            
            <tr>
            	<th>PW<span class="desc">(주민번호 뒷자리)</span></th>
            	<td><input type="password" id="pw" name="pw" placeholder="패스워드" /></td>
            </tr>
		
		<tr>
			<th colspan="2">
			<input type="button"  value="로그인" id="submitBtn" class="btn"/>
			<input type="button" class="btn" value="취소" id="resetBtn"/>
			<br><br>
			
			<span id="err" style="color: red; display: none;"></span>
			</th>
		</tr>            
            
            
            </table>
            
         </form>
      </div>
   </div>   
</body>
</html>




EmployeeDAO

일반직원 로그인

  • 관리자도 일반직원으로 로그인해서 테스트할 수 있어야하므로
    Grade(등급)을 조건으로 조회하지 않는다.
//일반 직원 로그인

	@Override
	public String login(String id, String pw) throws SQLException
	{
		//String result = ""; 	//-- 이렇게 하면 비밀번호 틀려도 넘어감
				String result = null;
				Connection conn = dataSource.getConnection();
				String sql = "SELECT NAME"
						  + " FROM EMPLOYEE"
						  + " WHERE EMPLOYEEID=? "
						    + " AND SSN2 = CRYPTPACK.ENCRYPT(?, ?)";
				PreparedStatement pstmt = conn.prepareStatement(sql);
				//pstmt.setString(1, id);
				pstmt.setInt(1, Integer.parseInt(id));
				pstmt.setString(2, pw);
				pstmt.setString(3, pw);
				
				ResultSet rs = pstmt.executeQuery();
				while (rs.next())
					result = rs.getString("NAME");
				
				rs.close();
				pstmt.close();
				conn.close();
				
				return result;
	}


	

관리자 로그인

	@Override
	public String loginAdmin(String id, String pw) throws SQLException
	{
		//String result = ""; 	//-- 이렇게 하면 비밀번호 틀려도 넘어감
				String result = null;
				Connection conn = dataSource.getConnection();
				String sql = "SELECT NAME"
						  + " FROM EMPLOYEE"
						  + " WHERE EMPLOYEEID=? "
						    + " AND SSN2 = CRYPTPACK.ENCRYPT(?, ?)"
						    + " AND GRADE=0";
				PreparedStatement pstmt = conn.prepareStatement(sql);
				//pstmt.setString(1, id);
				pstmt.setInt(1, Integer.parseInt(id));
				pstmt.setString(2, pw);
				pstmt.setString(3, pw);
				
				ResultSet rs = pstmt.executeQuery();
				while (rs.next())
					result = rs.getString("NAME");
				
				rs.close();
				pstmt.close();
				conn.close();
				
				return result;
	}




LoginFormController.java

  • 로그인 페이지 요청시 LoginForm(View)로 연결해줄 컨트롤러
public class LoginFormController implements Controller
{
	//Controller 인페이스의 handleRequest()메소드 재정의

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		
		//하는 일은 doGet , doPost 와 같다.
		
		//컨트롤러 내부 액션 처리 코드
		
		
		ModelAndView mav = new ModelAndView();
		
		mav.setViewName("LoginForm");
		
		return mav;
	}
  • dispatcher-servlet.xml
<!-- Login 폼 페이지 요청 Controller 등록 -->
	<bean name="/loginform.action" class="com.test.mvc.LoginFormController"></bean>




LoginController.java

  • 사용자가 로그인폼에서 id,pw,관리자를 입력하고 로그인을 시도할때 요청될 Controller
/*=================================
	#30.LoginController.java
	- 사용자 정의 컨트롤러 클래스
	- 로그인 액션 처리 전용 클래스.
	- 로그인 액션 처리 이후
	employeelist.action / emplist.action
	을 요청할수있도록
==================================*/

package com.test.mvc;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;


//※ Spring 이 제공하는 『Controller』 인터페이스를 구현함으로써
// 사용자 정의 컨트롤러 클래스를 구성한다.


public class LoginController implements Controller
{
	//Controller 인페이스의 handleRequest()메소드 재정의
	
	private IEmployeeDAO dao;
	
	

	public void setDao(IEmployeeDAO dao)
	{
		this.dao = dao;
	}



	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		
		//하는 일은 doGet , doPost 와 같다.
		
		//컨트롤러 내부 액션 처리 코드
		
		
		ModelAndView mav = new ModelAndView();
		
		// 이전 페이지(LoginForm.jsp)로부터 데이터 수신
		// -- id,pw, admin
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String admin = request.getParameter("admin");
		
        //String name = "";  //(Ⅹ) 이렇게 초기화하면 안됨
		String name = null;
		
		try
		{
			//로그인 처리 → 대상에 따른 로그인 처리 방식 구분(분기)
			// → 메소드 따로따로 만들어놨기 때문에
			if(admin==null)
			{
				//일반 사원 로그인
				name = dao.login(id, pw);
			}
			else
			{
				//관리자 로그인
				name = dao.loginAdmin(id, pw);
			}
			
			
		} catch (Exception e)
		{
			// TODO: handle exception
			System.out.println(e.toString());
		}
		
		// 로그인 성공했는지 실패했는지에 대한 분기
		// 로그인 수행에 따른 성공 여부 확인 및 구분 / 분기
		if(name==null)
		{
			//로그인 실패 → 로그인 폼을 다시 요청할 수 있도록 안내
			mav.setViewName("redirect:loginform.action");
		}
		else
		{
			//로그인 성공 →세션 구성
			// 로그인 성공한 것도, 관리자/일반직원 분기해줘야 한다.
			// 관리자인지 일반 직원인지의 여부 확인
			// 이름을 얻어내서 아래 조건 확인
			// 이름을 얻어내고, admin 이 null 인지 확인
			HttpSession session =  request.getSession();
			session.setAttribute("name", name);
			
			if(admin==null) //로그인은했는데 일반사원으로 로그인한사람
			{
				// emplist.action 페이지를 요청할 수 있도록 안내
				mav.setViewName("redirect:emplist.action");
				
			}
			else //관리자로 로그인 성공한 상황
			{
				
				//admin 속성을 세션에 추가
				session.setAttribute("admin", "");
				//employeelist.action 페이지를 요청할 수 있도록 안내
				mav.setViewName("redirect: employeelist.action");
				
				
			}
			
			
		}
		
		return mav;
	}

	
	
}

EmployeeListController.java

  • 위에 단계까지하면 로그인 프로세스는 정상적으로 작동하나
    사용자가 직접 employeelist.action을 url로 입력하면 로그인과정을 거치지 않아도
    web.xml(.action확인) -> dispatcher-servlet.xml(employeelist.action 으에 대한 요청을 처리하는 컨트롤러 요청하면서 dataSource에 DB IP를 넣고 이를 컨트롤러의 의존객체로써 채운후 dao를 컨트롤러에 채워줌) -> EmployeeList.jsp(view)호출 과정에 의해 로그인과정 없이 직원 리스트에 접근할수있다
  • 이를 방지하기위해 로그인 직후 이동하는 페이지인 employeelist.action 의 컨트롤러인 EmployeeListController.java에서 dao에 접근하여 직원 리스트를 가져오기 전에
//세션 처리과정 추가(로그인에 대한 확인 과정 추가)===================================
		HttpSession session = request.getSession();
		
		if(session.getAttribute("name")==null) //로그인이 되어있지 않은 상황
		{
			//로그인이 되어있지 않은 상황에서의 처리
			//-- 로그인 폼 페이지를 다시 요청할 수 있도록 안내
			mav.setViewName("redirect:loginform.action");
			return mav;
			
		}
		else if(session.getAttribute("admin")==null) //로그인은 되어있으나 관리자가 아님
		{
			//관리자가 아닌상황 즉, 일반 사원일 때의 처리
			//-- 현재의 일반회원으로써의 로그인(세션)을 해제하고 
			// 다시 관리자로 로그인 할 수있도록 처리
			mav.setViewName("redirect:logout.action");
			return mav;
		}
		
		//세션 처리과정 추가(로그인에 대한 확인 과정 추가)===================================
		
  • 위와 같이 넘어온 세션을 얻어와 세션의 name속성을 확인해 비어있을경우(로그인을 하지 않아 LoginController에서 db를 통해 직원nameor 관리자로서의 name을 받지 못했을경우)로그인 페이지로 돌려보낸다.
  • 단 세션을 얻어와 확인했을때 admin이 null (즉 로그인할때 관리자를 체크하지 않고 로그인에 성공했을경우 admin은 null값이므로 일반회원으로 로그인한것) 일경우 일반회원이므로 로그아웃시키고 로그인홈페이지로 돌려보낸다.(관리자로 다시 로그인해!)




LogoutController.java

public class LogoutController implements Controller
{
	
	
	
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		
		  //컨트롤러 내부 액션 처리 코드
	      ModelAndView mav = new ModelAndView();

	      
	      HttpSession session = request.getSession();
	      //session.invalidate();
	      
	      //session.setAttribute("name", null);
	      session.removeAttribute("name");
	      session.removeAttribute("admin");
	      
	      //로그아웃 뷰 페이지(정상적으로 로그아웃 처리되었다는 안내 페이지)
	      //삽입 가능~!!!
	      
	      mav.setViewName("redirect: loginform.action");
	      
	      
	      return mav;

	
	}
	
  • 이렇게 속성을 일일히 제거해야한다고?...

dispatcher-servlet 수정

<!-- 로그아웃 액션 Controller등록  -->
	
	<bean name="/logout.action" class="com.test.mvc.LogoutController"></bean>
	




EmployeeMenu.jsp

  • c:import에 의해 직원 리스트, 입력시 위에 떠있는 메뉴가 일반회원일때와 관리자일때 차이가 있어야함

쌤방식

<div class="btn-group" role="group">
<c:choose>
      <c:when test="${sessionScope.admin==null}">
         <a href =" employeelist.action" role="button" class="menubtn btn btn-success btn-lg" >직원 정보</a>
      </c:when>
      <c:otherwise>
         <a href =" emplist.action" role="button" class="menubtn btn btn-success btn-lg" >직원 관리</a>
         
      </c:otherwise>
   </c:choose>
   <c:choose>
      <c:when test="${sessionScope.admin==null}">
         <a href =" posotionlist.action" role="button" class="menubtn btn btn-success btn-lg" >지역 정보</a>
      </c:when>
      <c:otherwise>
         <a href =" poslist.action" role="button" class="menubtn btn btn-success btn-lg" >지역 관리</a>
         
      </c:otherwise>
   </c:choose>
   <c:choose>
      <c:when test="${sessionScope.admin==null}">
         <a href =" departmentlist.action" role="button" class="menubtn btn btn-success btn-lg" >부서 정보</a>
      </c:when>
      <c:otherwise>
         <a href =" deptlist.action" role="button" class="menubtn btn btn-success btn-lg" >부서 관리</a>
         
      </c:otherwise>
   </c:choose>
   <c:choose>
      <c:when test="${sessionScope.admin==null}">
         <a href =" regionlist.action" role="button" class="menubtn btn btn-success btn-lg" >직위 정보</a>
      </c:when>
      <c:otherwise>
         <a href =" reglist.action" role="button" class="menubtn btn btn-success btn-lg" >직위 관리</a>
         
      </c:otherwise>
   </c:choose>
    <a href="logout.action" class="menubtn btn btn-success btn-lg">로그 아웃</a>
</div>



</body>
</html>

내방식

<c:choose>
   <c:when test = "${sessionScope.admin == null }">
      <div class="btn-group" role="group">
         <a href="emplist.action" role="button" class="menubtn btn btn-success btn-lg">직원 정보</a>
         <a href="reglist.action" role="button" class="menubtn btn btn-success btn-lg">지역 정보</a>
         <a href="deptlist.action" role="button" class="menubtn btn btn-success btn-lg">부서 정보</a>
         <a href="poslist.action" role="button" class="menubtn btn btn-success btn-lg">직위 정보</a>
         
         <a href="logout.action" class="menubtn btn btn-success btn-lg">로그 아웃</a>
      </div>
   </c:when>
   <c:otherwise>
      <div class="btn-group" role="group">
         <a href="employeelist.action" role="button" class="menubtn btn btn-success btn-lg">직원 관리</a>
         <a href="regionlist.action" role="button" class="menubtn btn btn-success btn-lg">지역 관리</a>
         <a href="department.action" role="button" class="menubtn btn btn-success btn-lg">부서 관리</a>
         <a href="position.action" role="button" class="menubtn btn btn-success btn-lg">직위 관리</a>
         
         <a href="logout.action" class="menubtn btn btn-success btn-lg">로그 아웃</a>
      </div>
   </c:otherwise>
</c:choose>
  • 이로써 일반회원과 관리자의 메뉴를 구분하게됨

0개의 댓글