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