SpringMVC中Interceptor和Filter區別
阿新 • • 發佈:2018-08-01
通過 onf ron err mvc 無法 處理 上下 pin
Interceptor
主要作用:攔截用戶請求,進行處理,比如判斷用戶登錄情況,權限驗證,主要針對Action請求進行處理。是通過HandlerInterceptor 實現的。
配置如下:
<mvc:interceptors> <bean class="cn.appsys.testInterceptor"></bean>//攔截所有請求 <mvc:interceptor> <mvc:mapping path="/manager/backend/**"/> <bean class="cn.appsys.interceptor.SysInterceptor"/>//攔截上面請求 </mvc:interceptor> </mvc:interceptors>
一般攔截器可通過實現HandlerInterceptor接口或者繼承HandlerInterceptorAdapter實現。代碼如下:
public class TestInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("preHandle"); return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("postHandle"); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("afterCompletion"); } }
preHandle是在請求到達Controller之前實現,可進行用戶校驗登錄等操作,返回true後,請求到達Controller層;postHandle方法是在執行完Controller層代碼之後,DispatcherServlet進行視圖的渲染之前
執行,因此可以對ModelAndView 對象進行處理;afterCompletion方法是在DispatcherServlet進行視圖的渲染之後執行調用,主要是進行一些資源清理等工作。
註:只能對Controller請求進行攔截,對一些靜態資源無法攔截。
Filter
主要作用:統一設置字符集等。
依賴於servlet容器,過濾器實例只在初始化的時候調用一次。
過濾器在web.xml配置如下:
一般過濾器可通過實現Filter接口實現。代碼如下:
public class TestFilter implements Filter { @Override public void destroy() { System.out.println("filter destroy"); } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { System.out.println("filter doFilter before"); arg2.doFilter(arg0, arg1); System.out.println("filter doFilter after"); } @Override public void init(FilterConfig arg0) throws ServletException { System.out.println("filter init"); } }
攔截器和過濾器執行順序:
1、Filter.init();
2、Filter.doFilter(); before doFilter
3、HandlerInterceptor.preHandle();
4、Controller方法執行
5、HandlerInterceptor.postHandle();
6、DispatcherServlet視圖渲染
7、HandlerInterceptor.afterCompletion();
8、Filter.doFilter(); after doFilter
9、Filter.destroy();
Filter和Interceptor的區別
- Filter是基於函數回調(doFilter()方法)的,而Interceptor則是基於Java反射的(AOP思想)。
- Filter依賴於Servlet容器,而Interceptor不依賴於Servlet容器。
- Filter對幾乎所有的請求起作用,而Interceptor只能對action請求起作用。
- Interceptor可以訪問Action的上下文,值棧裏的對象,而Filter不能。
- 在action的生命周期裏,Interceptor可以被多次調用,而Filter只能在容器初始化時調用一次。
SpringMVC中Interceptor和Filter區別