filter는 특정 url 패턴에만 호출되도록 설정가능하다. ex) 로그인 요청시 활용 가능
1 2 3
* filter 작동 흐름 1
Client -> HTTP 요청 | WAS 영역 -> servlet filter 호출 -> dispatcher servlet 호출 -> controller 호출 |
filter를 통해 적절하지 않은 사용자 요청 ex) 비로그인 사용자 라고 판단되면, dispatcher servlet 호출을 안할수도 있다.
1 2 3
* filter 작동 흐름 2
Client -> HTTP 요청 | WAS 영역 -> servlet filter 호출 (비로그인 확인)
filter chain : 여러개의 filter 를 추가하여 적용 가능하다.
1 2 3
* filter chain Client -> HTTP 요청 | WAS 영역 -> filter A => filter B => ....
javax.servlet내 filter 는 다음과 같은 spec을 가지며, 해당 인터페이스를 구현하고, servlet container에 등록하면, servlet container가 생성될때, 해당 필터의 init() 초기화 메소드를 호출하고, 싱글톤 객체로 생성 및 관리한다.
/*** The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain. The FilterChain passed in to this method allows the Filter to pass on the request and response to the next entity in the chain. ***/ // client 요청시마다 doFilter가 호출된다. publicvoiddoFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException;
@Bean public FilterRegistrationBean logFilter(){ FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>(); filterFilterRegistrationBean.setFilter(new LogFilter()); // filter는 chain으로 적용 가능하기 때문에 순서를 적용해주어야 한다. filterFilterRegistrationBean.setOrder(1); // 적용할 url 패턴 filterFilterRegistrationBean.addUrlPatterns("/*"); return filterFilterRegistrationBean; } }
Spring Interceptor
spring MVC 제공 기술
servlet filter 와 적용되는 순서가 다르다.
dispatcher servlet과 controller 사이에서 호출된다.
servlet filer와 마찬가지로 urlPattern 적용 가능 (마찬가지로 로그인 및 인증체크 모듈 개발에 용이하다. )
1 2 3
* Spring Interceptor 작동 흐름 1
Client -> HTTP 요청 | WAS 영역 -> servlet filter 호출 -> dispatcher servlet 호출 -> spring interceptor 호출 ->controller 호출 |
spring interceptor도 똑같이 chain으로 구성할 수 있다.
1 2
* Spring Interceptor Chain Client -> HTTP 요청 | WAS 영역 -> servlet filter 호출 -> dispatcher servlet 호출 -> spring interceptor A => spring interceptor B => ... |
org.springframework.web.servlet.HandlerInterceptor 인터페이스를 구현함으로, 사용 가능하다.
servlet filerd와 차이점 (=> inteceptor가 지원해주는 기능이 더 많다.) 1.controller 호출 전 , 후 , 요청 완료 이후 총 3 단계로 세분화되어 있음 2.preHandler에서 handler(Controller) 정보를 받을 수 있음 3.postHandler에서 ModelAndView 정보를 받을 수 있음
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
package org.springframework.web.servlet;
publicinterfaceHandlerInterceptor{ // controller 호출 전 // handler == controller // return 값이 true인 경우에만 다음으로 진행된다. defaultbooleanpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {returntrue;} // controller 호출 후 defaultvoidpostHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView)throws Exception { } // Http 요청 완료 이후 (뷰 렌더링 이후에 호출된다.) // handler에서 발생한 Exception을 parameter로 받을 수 있다. defaultvoidafterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex)throws Exception { } }
spring interceptor는 servlet filter 보다 세분화된 기능을 지원하며, handler에서 예외 발생시에는 postHandle은 호출되지 않고, afterCompletion method만 호출된다.
1 2 3
* Spring Interceptor 작동 흐름 2 (handler에서 Exception 발생시 )