• Filter调用链


    client-> doFilter()中Chain.doFIlter()之前的代码->china.doFilter()->......->Act

    ion/Servlet.service()->doFilter()中Chain.doFIlter()之后的代码->client

    注意,doFilter()是Filter实现类必须实现的方法. 区别与Chain.doFilter()的同名方法.
     
     
    下面是Filter与Inteceptor的区别:
    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请求来辨别是否过滤。

  • 相关阅读:
    java8特性 Optional 工具类
    SpringBoot 配置支付宝接口
    Redis宕机 快速恢复
    flowable流程引擎通过模型ID部署流程
    java OA系统 自定义表单 流程审批 电子印章 手写文字识别 电子签名 即时通讯
    Mybatis 动态执行SQL语句
    idea 访问 jsp 404问题
    变量名的命名
    CSS设计 Search窗口
    jQuery实现Ajax功能示例
  • 原文地址:https://www.cnblogs.com/highriver/p/1734350.html
Copyright © 2020-2023  润新知