스프링/4. 스프링 MVC-2

59. 스프링 인터셉터 로그인 필터 구현

sdafdq 2023. 9. 9. 16:58
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession(false);

        if(session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null){
            response.sendRedirect("/login?redirectURL=" + request.getRequestURI());
            return false;
        }
        return true;
    }
}

 

짧아졌다.

 

세션 확인하고, (request.getSession 할 때 인자를 false로 줘서 없을 시 새로 생성되는 걸 막고)

 

세션이 아예 없거나 아니면 세션이 있더라도 로그인에 관한 세션값을 가지고 있지 않거나 (세션은 데이터 모둠임)

 

그러면 사용자가 가려고 했던 URI를 쿼리 파라미터로 넘겨주면서 리다이렉트 시킨다.

response.sendRedirect(경로) 로 쉽게 리다이렉트 시킬 수 있다.

저 쿼리 파라미터에 대한 처리는 로그인에 관한 컨트롤러에서 처리하도록 해 놨다.

 

@PostMapping("/login")
public String loginV3(@Validated @ModelAttribute LoginForm loginForm, BindingResult bindingResult, HttpServletRequest request,
@RequestParam(defaultValue = "/") String redirectURL){
    if(bindingResult.hasErrors()){
        return "login/loginForm";
    }

    Member loginMember = loginService.login(loginForm.getLoginId(), loginForm.getPassword());

    if(loginMember == null){
        bindingResult.reject("loginFail", "아이디 혹은 비밀번호가 맞지 않습니다.");
        return "/login/loginForm";
    }

    HttpSession session = request.getSession(); //세션 있으면 반환, 없으면 신규 생성
    session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
    return "redirect:" + redirectURL;
}

 

참고로 인터셉터에서 false는 실패, 그냥 거기서 멈춰버린다. 필터에서 걸러지면 false로 주면 된다고 생각하면 된다. 따로 처리할 게 아니라면.

true면 계속 이어서 가는거다.

 

 

 

@Configuration
public class WebConfig implements WebMvcConfigurer {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor())
                .order(1)
                .addPathPatterns("/**")
                .excludePathPatterns("/css/**", "/*.ico", "/error");

        registry.addInterceptor(new LoginCheckInterceptor())
                .order(2)
                .addPathPatterns("/**")
                .excludePathPatterns("/","/members/add","/login","/logout","/css/**", "/*.ico", "/error");
    }
}

@Configuration에 등록해줬다. WebMvcConfigurer를 구현하여

addInterceptors를 override하여 인터셉터를 추가시켜 준다.

 

registry.addInterceptor 인터셉터 추가

순서

경로 지정(추가), 모든 경로

그 중 인터셉터 할 필요가 없는 경로는 제외.

 

이므로, 마찬가지로 로그인 체크 인터셉터도 

 

경로를 

홈("/"), 멤버추가(회원가입), 로그인, 로그아웃, css, 아이콘파일, 에러에 대한 경로는 필터링 하는데 제외시켰다.

 

 

 

이렇게 편리하게 공통작업에 대한 것을 애노테이션으로도 구현할 수 있다.

'스프링 > 4. 스프링 MVC-2' 카테고리의 다른 글

61. 서블릿 예외처리  (0) 2023.09.10
60. ArgumentResolver 활용  (0) 2023.09.09
58. 스프링 인터셉터 요청로그  (0) 2023.09.09
57. 스프링 인터셉터  (0) 2023.09.09
56. 인증 체크 필터 구현  (0) 2023.09.09