<%@ 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()
		{
			
			
			if($("#id").val()=="" || $("#pw").val()=="")
				{
				
				$("#err").html("항목을 모두 입력해야 합니다.").css("display","inline");
				return;
				
				}
		
			$("#loginForm").submit();
		
		});
		
		
	});
</script>
</head>
<body>
   
   <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 = null;
				Connection conn = dataSource.getConnection();
				String sql = "SELECT NAME"
						  + " FROM EMPLOYEE"
						  + " WHERE EMPLOYEEID=? "
						    + " AND SSN2 = CRYPTPACK.ENCRYPT(?, ?)";
				PreparedStatement pstmt = conn.prepareStatement(sql);
				
				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 = 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.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;
	}
- 로그인 페이지 요청시 LoginForm(View)로 연결해줄 컨트롤러
 
public class LoginFormController implements Controller
{
	
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		
		
		
		
		
		
		ModelAndView mav = new ModelAndView();
		
		mav.setViewName("LoginForm");
		
		return mav;
	}
	<bean name="/loginform.action" class="com.test.mvc.LoginFormController"></bean>
LoginController.java
- 사용자가 로그인폼에서 id,pw,관리자를 입력하고 로그인을 시도할때 요청될 Controller
 
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;
public class LoginController implements Controller
{
	
	
	private IEmployeeDAO dao;
	
	
	public void setDao(IEmployeeDAO dao)
	{
		this.dao = dao;
	}
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		
		
		
		
		
		
		ModelAndView mav = new ModelAndView();
		
		
		
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String admin = request.getParameter("admin");
		
        
		String name = null;
		
		try
		{
			
			
			if(admin==null)
			{
				
				name = dao.login(id, pw);
			}
			else
			{
				
				name = dao.loginAdmin(id, pw);
			}
			
			
		} catch (Exception e)
		{
			
			System.out.println(e.toString());
		}
		
		
		
		if(name==null)
		{
			
			mav.setViewName("redirect:loginform.action");
		}
		else
		{
			
			
			
			
			
			HttpSession session =  request.getSession();
			session.setAttribute("name", name);
			
			if(admin==null) 
			{
				
				mav.setViewName("redirect:emplist.action");
				
			}
			else 
			{
				
				
				session.setAttribute("admin", "");
				
				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.removeAttribute("name");
	      session.removeAttribute("admin");
	      
	      
	      
	      
	      mav.setViewName("redirect: loginform.action");
	      
	      
	      return mav;
	
	}
	
dispatcher-servlet 수정
	
	<bean name="/logout.action" class="com.test.mvc.LogoutController"></bean>
	
- 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>