Posted on 2012-10-20 14:21
云云 閱讀(444)
評論(0) 編輯 收藏
1、攔截器是基于java反射機制的,而過濾器是基于函數回調的。
2、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器。
3、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。
4、攔截器可以訪問Action上下文、值棧里的對象,而過濾器不能。
5、在Action的生命周期中,攔截器可以多次調用,而過濾器只能在容器初始化時被調用一次。
過濾器是在java web中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然后再傳入servlet或者struts的 action進行業務邏輯,
比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),
或者在傳入servlet或者 struts的action前統一設置字符集,
或者去除掉一些非法字符(聊天室經常用到的,一些罵人的話)。。。
攔截器 可通過的是符合條件的action。 攔截器本身是一個普通的Java對象,它能動態攔截Action調用,
Action執行前后執行攔截器本身提供的各種個樣的Web項目需求。也可以阻止Action的執行,同時也可以提取
Action中可以復用的部分。
前段時間參與一個項目,過濾器用的是Interceptor 覺得比以前用的Filter好用很多,現在拿出來比較一下
Filter
該過濾器的方法是創建一個類XXXFilter實現此接口,并在該類中的doFilter方法中聲明過濾規則,然后在配置文件web.xml中聲明他所過濾的路徑
<filter>
<filter-name>XXXFilter</filter-name>
<filter-class>
com.web.util.XXXFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>XXXFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
Interceptor
該過濾器的方法也是創建一個類XXXInterceptor實現此接口,在該類中intercept方法寫過濾規則,不過它過濾路徑的方法和Filter不同,它與strut.xml結合使用,
創建一個strus.xml的子配置文件struts-l99-default.xml,它繼承與struts2的struts-default,此配置文件是其他子配置文件的父類,只要是繼承與該文件的配置文件所聲明的路徑都會被它過濾 如下
<package name="XXX-default" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="authentication" class="com.util.XXXInterceptor" />
<interceptor-stack name="user">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="authentication" />
</interceptor-stack>
<interceptor-stack name="user-submit">
<interceptor-ref name="user" />
<interceptor-ref name="token" />
</interceptor-stack>
<interceptor-stack name="guest">
<interceptor-ref name="defaultStack" />
</interceptor-stack>
<interceptor-stack name="guest-submit">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="token" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="user" />
</package>
比較一,filter基于回調函數,我們需要實現的filter接口中doFilter方法就是回調函數,而interceptor則基于java本身的反射機制,這是兩者最本質的區別。
比較二,filter是依賴于servlet容器的,即只能在servlet容器中執行,很顯然沒有servlet容器就無法來回調doFilter方法。而interceptor與servlet容器無關。
比較三,Filter的過濾范圍比Interceptor大,Filter除了過濾請求外通過通配符可以保護頁面,圖片,文件等等,而Interceptor只能過濾請求。
比較四,Filter的過濾例外一般是在加載的時候在init方法聲明,而Interceptor可以通過在xml聲明是guest請求還是user請求來辨別是否過濾。
</filter-class>
</filter>
<filter-mapping>
<filter-name>XXXFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
Interceptor
該過濾器的方法也是創建一個類XXXInterceptor實現此接口,在該類中intercept方法寫過濾規則,不過它過濾路徑的方法和Filter不同,它與strut.xml結合使用,
創建一個strus.xml的子配置文件struts-l99-default.xml,它繼承與struts2的struts-default,此配置文件是其他子配置文件的父類,只要是繼承與該文件的配置文件所聲明的路徑都會被它過濾 如下
<package name="XXX-default" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="authentication" class="com.util.XXXInterceptor" />
<interceptor-stack name="user">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="authentication" />
</interceptor-stack>
<interceptor-stack name="user-submit">
<interceptor-ref name="user" />
<interceptor-ref name="token" />
</interceptor-stack>
<interceptor-stack name="guest">
<interceptor-ref name="defaultStack" />
</interceptor-stack>
<interceptor-stack name="guest-submit">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="token" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="user" />
</package>
比較一,filter基于回調函數,我們需要實現的filter接口中doFilter方法就是回調函數,而interceptor則基于java本身的反射機制,這是兩者最本質的區別。
比較二,filter是依賴于servlet容器的,即只能在servlet容器中執行,很顯然沒有servlet容器就無法來回調doFilter方法。而interceptor與servlet容器無關。
比較三,Filter的過濾范圍比Interceptor大,Filter除了過濾請求外通過通配符可以保護頁面,圖片,文件等等,而Interceptor只能過濾請求。
比較四,Filter的過濾例外一般是在加載的時候在init方法聲明,而Interceptor可以通過在xml聲明是guest請求還是user請求來辨別是否過濾。