bong-u/til

MVC 3 : Session, Interceptor, Cookies

수정일 : 2024-11-15

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로 연결되는 것을 볼 수 있다.

org.springframework.beans.NotReadablePropertyException: Invalid property ‘rememberEmail’ of bean class [controller.LoginCommand]

  • LoginCommand.java 속 setRemberEmail(boolean rememberEmail)함수 이름에 오타가 있었다
  • getter를 인식하지 못해서 발생한 오류이다