spring拦截器-过滤器的区别
1. ?理解
攔截器 :是在面向切面編程的時候,在你的 service 或者一個方法前調用一個方法,或者在方法后調用一個方法;比如動態代理就是攔截器的簡單實現,在你調用方法前打印出字符串(或者做其它業務邏輯的操作),也可以在你調用方法后打印出字符串,甚至在你拋出異常的時候做業務邏輯的操作。
過濾器:是在 javaweb 中,你傳入的 request、response 提前過濾掉一些信息,或者提前設置一些參數,然后再傳入 servlet 或者 struts 的 action 進行業務邏輯,比如過濾掉非法url(不是 login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入 servlet 或者 struts 的 action 前統一設置字符集,或者去除掉一些非法字符.。
?
2. ?具體區別
攔截器是 AOP( Aspect-Oriented Programming) 的一種實現,底層通過動態代理模式完成。
區別:
(1)攔截器是基于 java 的反射機制的,而過濾器是基于函數回調。
(2)攔截器不依賴于 servlet 容器,而過濾器依賴于 servlet 容器。
(3)攔截器只能對 action 請求起作用,而過濾器則可以對幾乎所有的請求起作用。
(4)攔截器可以訪問 action 上下文、值棧里的對象,而過濾器不能。
(5)在 action 的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
3. ?本質區別
從靈活性上說攔截器功能更強大些,Filter能做的事情,他都能做,而且可以在請求前,請求后執行,比較靈活。
Filter主要是針對URL地址做一個編碼的事情、過濾掉沒用的參數、安全校驗(比較泛的,比如登錄不登錄之類),太細的話,還是建議用 interceptor。
不過還是根據不同情況選擇合適的。
4. ?摘要
Spring 的攔截器與 Servle t的 Filter 有相似之處,比如二者都是 AOP 編程思想的體現,都能實現權限檢查、日志記錄等。
不同的是:
1、使用范圍不同:Filter是Servlet規范規定的,只能用于Web程序中。而攔截器既可以用于Web程序,也可以用于Application、Swing程序中。
2、規范不同:Filter是在Servlet規范中定義的,是Servlet容器支持的。而攔截器是在Spring容器內的,是Spring框架支持的。
3、使用的資源不同:同其他的代碼塊一樣,攔截器也是一個Spring的組件,歸Spring管理,配置在Spring文件中,因此能使用Spring里的任何資源、對象,例如Service對象、數據源、事務管理等,通過IoC注入到攔截器即可;而Filter則不能。
4、深度不同:Filter 只在 Servlet 前后起作用。而攔截器能夠深入到方法前后、異常拋出前后等,因此攔截器的使用具有更大的彈性。所以在 Spring 構架的程序中,要優先使用攔截器。 (重點)
實際上 Filter 和 Servlet 極其相似,區別只是Filter不能直接對用戶生成響應。實際上 Filter 里 doFilter() 方法里的代碼就是從多個 Servlet 的 service() 方法里抽取的通用代碼,通過使用Filter可以實現更好的復用。
filter是一個可以復用的代碼片段,可以用來轉換 HTTP 請求、響應和頭信息。Filter 不像 Servlet,它不能產生一個請求或者響 應,它只是修改對某一資源的請求,或者修改從某一的響應。
JSR 中說明的是,按照多個匹配的Filter,是按照其在 web.xml 中配置的順序 來執行的。 所以這也就是,把自己的 Filter 或者其他的 Filter(比如UrlRewrite的Filter)放在 springmvc 的 DispatcherFilter 的前面的原因。因為,它們需要在請求被 springmvc 框架處理之前,做一些前置的工作。 當 Filter 被調用,并且進入了 SpringMVC 的 DispatcherFilter 中 后,SpringMVC 會按照在 Action 中配置的 Interceptor Stack中的 Interceptor 的順序,來調用 Interceptor。
?
本文地址:http://www.cnblogs.com/niceyoo/articles/8743116.html
總結
以上是生活随笔為你收集整理的spring拦截器-过滤器的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ceph学习之pool
- 下一篇: Jmeter作用域