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 |