struts2拦截器(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请求来辨别是否过滤 


另外:
任何通过Struts,或是JSF的Controller Servlet处理的request,都会在过滤器中先行处理(filter),才把控制权交还给Struts或是JSF,这时interceptor才起作用。注意这个顺序使用一种通俗的方式来讲是:filter在进入网页时选择,interceptor在提交业务过程中进行拦截,来加入需要的另外加入的业务逻辑。

常用的Filter,就是解决字符集问题的,如果在每个Servlet里都写request.setCharacterEncoding("UTF-8")太麻烦了,所以用个Filter,在Filter里写request.setCharacterEncoding("UTF-8"),

struts2 是用filter来做中心控制器。

 

 

 

首先,FILTER是基于request,respone的http过滤器,这个过滤器的好处在于能够对每一个请求都能拦截并对请求进行转发,在转发过程中对请求的合法性做出自定义的响应,对于一个空白的页面,如果用户没有获得授权,在filter的拦截下将无法访问。在使用过程中,我个人对filter的使用倾向是作为系统“外壳”,因为当一个未得到授权的用户,任何页面的访问都是存在威胁,作为权限控制中自定义的filter可以作为项目应用的底层模块。

 

对于struts2的默认拦截器,其实本身也是filter,只不过它是基于struts2的Filterdispatcher的子拦截器,必须认识到的是,这个拦截器在权限控制中,只能作为上层权限控制的补充,因为它只能为action提供拦截,对于其他页面的访问无法做出拦截与响应,在应用中应该是后台管理模块的强力补充。

你可能感兴趣的:(struts2,filter,Interceptor)