@GetMapping("/") public String home() { return "home"; } @GetMapping("/login") public String login() { return "login"; }
스프링은 기본적으로 설정을 건드리지 않으면 반환하는 문자열 뒤에 .jsp를 붙여서 반환한다. 따라서 해당 파일 명과 일치하는 View가 있어야 하므로, login.jsp와 home.jsp 파일을 만들어 주었다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="<c:url value='/login'/>" method="post"> <input type="text" name="id" value="${cookie.id.value}"> <input type="password" name="pwd"> <input type="submit" value="submit"> <input type="checkbox" ${empty cookie.id.value ? "":"checked" } name="rememberId">아이디 저장 </form> </body> </html>
login.jsp 파일을 작성해준다. jstl을 이용해서 Method는 post를 이용하여 모든 값들을 /login으로 보내준다.
get방식의 /login은 login.jsp를 보여주고, post방식의 /login은 아이디 비밀번호를 확인 후 일치하면, 아이디 저장을 체크하였을 경우, 쿠키를 생성하고, 세션에 저장하는 식으로 코드를 작성하였다. 쿠키에 id 정보가 있을경우 아이디 저장에 체크가 되게하고, id가 표시되어 있도록 하였다.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c:set var="loginOut" value="${sessionScope.id==null ? 'login' : 'logout'}"/> <c:set var="loginOutLink" value="${sessionScope.id==null ? '/login' : '/logout'}"/> <html> <head> <title>loginForm</title> </head> <body> <li><a href="<c:url value='${loginOutLink}'/>">${loginOut}</a></li> <li><a href="<c:url value='/login'/>">login</a> <li><a href="<c:url value='/logout'/>">logout</a> <li><a href="<c:url value='/board'/>">board</a> </body> </html>
body에 링크를 4개 만들어주었는데, 2번째 부터 4번째 까지의 링크는 직접 url을 설정해줘서 바로 갈 수 있게 해주었는데, 첫번째 링크는 session 객체의 id가 null , 즉 로그인 상태가 아닐 경우 /login으로 연결해주고, 로그인 상태일 경우 /logout으로 연결해주도록 설정했다.
또 login 상태일 경우 링크의 이름이 logout으로 보여지고, logout 상태일 경우 login으로 표시되게 하였다.
> private boolean idCheck(String id,String pwd) {
if(id.equals("admin") && pwd.equals("1234")) {
return true;
}else {
return false;
}
}
private boolean rememberId(boolean rememberId) {
return rememberId;
}
private boolean isLogin(HttpServletRequest request) {
HttpSession session = request.getSession();
if(session.getAttribute("id") == null) {
return false;
}else {
return true;
}
}
idCheck() 메서드는 id와 pwd가 "admin"이고 "1234" 일때 true를 return해주고 아니면 false를 return 해준다.
rememberId 메서드는 login에서 checkbox의 name을 rememberId로 해놓았는데, 이 값이 넘어올때 체크가 되어 있다면 true, 아니면 false가 넘어온다. 그렇기 때문에 return 값을 boolean으로 하였다.
isLogin() 메서드는 session 객체에 id가 저장이 되어 있는지를 확인하고, 저장이 되어있지 않다면 false, 저장되어 있을경우 true를 return 해준다.
@PostMapping("/login")
public String loginCheck(String id,String pwd,HttpServletRequest request,
HttpServletResponse response, boolean rememberId) {
if(!idCheck(id,pwd)) {
return "redirect:/login";
}
HttpSession session = request.getSession();
session.setAttribute("id", id);
if(rememberId(rememberId)) {
Cookie cookie = new Cookie("id", id);
response.addCookie(cookie);
}else {
Cookie cookie = new Cookie("id", id);
cookie.setMaxAge(0);
response.addCookie(cookie);
}
return "redirect:/";
}
id와 pwd를 체크해서, id와 pwd가 설정해놓은 "admin" 과 "1234"가 아닐 경우, login.jsp로 redirect 하고,
id와 pwd가 설정해놓은 "admin" 과 "1234"를 일치한다면, session에 id를 저장하고, rememberId에 체크가 되어 있다면 Cookie에 id를 저장한다. 만약 rememberId에 체크가 되어 있지 않다면, 쿠키에 id를 저장하면서 쿠키의 수명을 0으로 설정하면 쿠키가 삭제된다.
@GetMapping("/logout")
public String logout(HttpSession session) {
session.invalidate();
return "redirect:/";
}
session을 만료시키는 방식으로 session에서 ID를 삭제하여, 로그인이 풀리도록 구현하였다.
실습을 혼자 해보면서 마지막 session 로그인/로그아웃을 제대로 구현을 못했는데 왜냐하면 JSP파일을 처음 생성했을때 pagesession의 값이 false로 되어 있었기 때문이다. 이 한줄을 못찾아서 거의 1시간을 헤맸지만 이렇게 헤매고 찾으면서 하나하나 지식을 쌓아가는 것 같아, 그 부분은 매우 만족스럽다.