- 스프링 인터셉터도 서블릿 필터와 같이 웹과 관련된 공통 관심 사항을 효과적으로 해결할 수 있는 기술이다.
서블릿 필터
가서블릿이 제공
하는 기술이라면,스프링 인터셉터
는스프링 MVC 가 제공
하는 기술이다.- 둘다 웹과 관련된 공통 관심 사항을 처리하지만, 적용되는 순서와 범위, 그리고 사용방법이 다르다.
HTTP요청
->WAS
->필터
->서블릿
->스프링 인터셉터
->컨트롤러
스프링 인터셉터
는디스패처 서블릿
과컨트롤러 사이
에서컨트롤러 호출 직전에 호출
된다.스프링 인터셉터
는스프링 MVC가 제공
하는 기능이기 때문에 결국디스패처 서블릿 이후에 등장
하게 된다.정밀한 URL 패턴을 적용
할 수 있다.
Handler Interceptor 인터페이스 사용
- 컨트롤러 호출 전 : preHandle
- 컨트롤러 호출 후 : postHandle
- 요청 완료 이후 : afterCompletion, 뷰가 렌더링 된 이후에 호출된다.
public class LogInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String requestURI = request.getRequestURI(); System.out.println("[interceptor] requestURI : " + requestURI); return true; // false -> 이후에 진행을 하지 않는다. } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("[interceptor] postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("[interceptor] afterCompletion"); }
public class LoginCheckInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String requestURI = request.getRequestURI(); System.out.println("[interceptor] : " + requestURI); HttpSession session = request.getSession(false); if(session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) { // 로그인 되지 않음 System.out.println("[미인증 사용자 요청]"); //로그인으로 redirect response.sendRedirect("/login?redirectURL=" + requestURI); return false; } // 로그인 되어있을 떄 return true; } }
order()
: 인터셉트의 호출 순서를 지정한다. 낮을 수록 먼저 호출된다.addPathPatterns("/**")
: 인터셉터를 적용할 URL 패턴
을 지정한다.excludePathPatterns("/error")
: 인터셉터에서 제외한 패턴
을 지정한다.url 패턴
@Component public class WebConfig implements WebMvcConfigurer{ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LogInterceptor()) // LogInterceptor 등록 .order(1) // 적용할 필터 순서 설정 .addPathPatterns("/**") .excludePathPatterns("/error"); // 인터셉터에서 제외할 패턴 registry.addInterceptor(new LoginCheckInterceptor()) //LoginCheckInterceptor 등록 .order(2) .addPathPatterns("/**") .excludePathPatterns("/", "/members/add", "/login", "/logout", "/css/**"); } }