過濾器與攔截器區別
參考:http://www.cnblogs.com/dreamroute/p/4198087.html?utm_source=tuicool
過濾器
過濾器是一個程序,它先於與之相關的servlet或JSP頁面運行在服務器上。它是隨你的web應用啟動而啟動的,只初始化一次,以后就可以攔截相關請求,只有當你的web應用停止或重新部署的時候才銷毀。
作用
請求和回應的過濾,傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然后再傳入servlet或者struts的action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者struts的action前統一設置字符集,或者去除掉一些非法字符(聊天室經常用到的,一些罵人的話)。
Servlet過濾器的基本原理
在請求進入容器之后,還未進入Servlet之前進行預處理;在請求結束返回給前端之前進行后期處理。處理完成后,它會交給下一個過濾器處理,直到請求發送到目標為止。
攔截器
攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或字段被訪問之前,進行攔截然后在之前或之后加入某些操作。比如日志,安全等。
攔截器鏈,就是將攔截器按一定的順序聯結成一條鏈。在訪問被攔截的方法或字段時,攔截器鏈中的攔截器就會按其之前定義的順序被調用。
一般攔截器方法都是通過動態代理的方式實現。
作用
比如通過它來進行權限驗證,或者判斷用戶是否登陸,或者是像12306 判斷當前時間是否是購票時間。
區別
①攔截器是基於動態代理的,而過濾器是基於函數回調。
②攔截器不依賴於servlet容器,通過動態代理實現,過濾器依賴於servlet容器。
③攔截器可以在方法前后,異常前后等調用,而過濾器只能在請求前和請求后各調用一次。
④攔截器可以利用依賴注入,因此在Spring框架程序中,優先攔截器。
1.過濾器是JavaEE標准,采用函數回調的方式進行。是在請求進入容器之后,還未進入Servlet之前進行預處理,並且在請求結束返回給前端這之間進行后期處理。
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("before...");
chain.doFilter(request, response);
System.out.println("after...");
}
2.攔截器是被包裹在過濾器之中的。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
看一下執行順序