<%@ 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>