Session
로그인 할 때 세션에 등록
- LoginController.java
1@PostMapping 2public String submit(LoginCommand loginCommand, Errors errors, HttpSession session) { 3new LoginCommandValidator().validate(loginCommand, errors); 4if (errors.hasErrors()) { 5 return "login/loginForm"; 6} 7 8try { 9 AuthInfo authInfo = authService.authenticate(loginCommand.getEmail(), loginCommand.getPassword()); 10 11 session.setAttribute("authInfo", authInfo); 12 return "login/loginSuccess"; 13} 14catch (WrongIdPasswordException e) { 15 errors.reject("idPasswordNotMatching"); 16 return "login/loginForm"; 17} 18}
로그아웃 할때 세션에서 삭제
- LogoutController.java
1@RequestMapping("/logout") 2public String logout(HttpSession session) { 3 session.invalidate(); 4 return "redirect:/main"; 5}
로그인 상태 여부에 따라 다르게 보여주기
1<c:if test="${ empty authInfo }">
2<p>환영합니다.</p>
3<p>
4 <a href="<c:url value="/register/step1" />">[회원 가입하기]</a>
5 <a href="<c:url value="/login" />">[로그인]</a>
6</p>
7</c:if>
8
9<c:if test="${! empty authInfo }">
10<p>${authInfo.name}님, 환영합니다.</p>
11<p>
12 <a href="<c:url value="/edit/changePassword" />">[비밀번호 변경]</a>
13 <a href="<c:url value="/logout" />">[로그아웃]</a>
14</p>
15</c:if>
Interceptor
-
로그인하지 않은 상태에서 접근하면 리다이렉트를 해줘야하는 사이트가 있다고하자
-
HttpSession에 특정 개체가 존재하는지 검사해서 있다면 redirect할 수 있다.
-
ChnagePwdController.java > public String form()
1AuthInfo authInfo = (AuthInfo) session.getAttribute("authInfo"); 2if (authInfo == null) { 3 return "redirect:/login"; 4} 5return "edit/changePwdForm";
-
하지만 여러 부분에서 이런 로직을 일일이 적용하는 것은 불편하다
-
이때 HandlerInterceptor 인터페이스를 구현한다
-
AuthCheckInterceptor.java
1public class AuthCheckInterceptor implements HandlerInterceptor { 2 @Override 3 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 4 HttpSession session = request.getSession(false); 5 if(session != null) { 6 Object authInfo = session.getAttribute("authInfo"); 7 if (authInfo != null) { 8 return true; 9 } 10 } 11 response.sendRedirect(request.getContextPath() + "/login"); 12 return false; 13 } 14}
-
MvcConfig.java
1@Bean 2public AuthCheckInterceptor authCheckInterceptor() { 3 return new AuthCheckInterceptor(); 4} 5 6@Override 7public void addInterceptors(InterceptorRegistry registry) { 8 registry.addInterceptor(authCheckInterceptor()) 9 .addPathPatterns("/edit/**"); 10}
-
/edit/** 패턴으로 요청이 들어오면 authCheckInterceptor로 연결되는 것을 볼 수 있다.
Cookie
org.springframework.beans.NotReadablePropertyException: Invalid property ‘rememberEmail’ of bean class [controller.LoginCommand]
- LoginCommand.java 속 setRemberEmail(boolean rememberEmail)함수 이름에 오타가 있었다
- getter를 인식하지 못해서 발생한 오류이다