Servlet Filter 보다는 Spring Interceptor에 무게를 더 두겠습니다!
filter의 흐름 과정을 보면 Controller에 가기 전에 이미 filter를 처리할 수 있으므로 번거롭게 controller마다 로직을 추가 안해도 되고 공통 관심사를 처리할 수 있습니다!
filter만으로도 충분히 훌륭하지만 filter개발 시 로직이 수행된 뒤에 filter를 chain으로 이어줘야한다는 번거로움이 있습니다. chain으로 이어주지 않으면 web app에 오류를 끼칠 수도 있죠.
그래서 스프링은 인터셉터라는 강력한 기능을 도입했습니다!
Spring Interceptor는 Spring Mvc에서 특화된 기능을 제공.. filter보다 더욱 편리할 수 있다
CODE를 봅시다!
처리 방법 : session이 존재하지 않다거나 session의 value가 존재하지 않다면 로그인된 상태라 보지 않을 것임!
로그인 처리과정은 이미 개발 완료된 상태라고 전제를 깔고 가겠습니다
LoginInterceptor
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
if(session==null || session.getAttribute("loginMember")==null){
response.sendRedirect("/login")
return false;
}
return true;
}
}
return true : 정상 호출, 다음 인터셉터나 controller가 호출됨.
return false : 적절하지 않은 요청. 다음 인터셉터나 controlelr 호출 안됨. 즉, 로그인이 안된 상황이라 볼 수 있음.
response.sendRedirect("/login")을 줌으로서 다시 로그인을 하도록 요청을 하게 됨.
WebConfig
스프링 Bean에 인터셉터를 추가 해주기 위해 WebMvcConfigurer를 implements 해줘야함.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.order(1)
.addPathPatterns("/**")
.excludePathPatterns("/","/members/add","/login","/logout","/css/**","/*.ico","/error");
}
}
인터셉터를 스프링에 등록해 주면 됩니다!
코드를 설명하자면
"/","/members/add","/login","/logout","/css/**","/*.ico","/error"
이 경로들을 제외하고는 모든 경로에 로그인 인증을 한다고 보시면 됩니다!
이 글은 인프런 김영한님의 '스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술'을 수강하고 작성합니다.
출처:https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard