zoukankan      html  css  js  c++  java
  • StrutsPreparedAndExcuteFilter与Interceptor

    filter详解

    Filter种类(servlet预处理)

    • 用户授权的Filter:Filter负责检查用户请求,对用户访问权限的控制
    • 日志Filter:详细记录某些特殊的用户请求。
    • 负责解码的Filter:包括对非标准编码的请求解码。
    • Filter可负责拦截多个请求或响应;一个请求或响应也可被多个请求拦截

    filter的常用方法与生命周期

                void destory()

                void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)

                void init(FilterConfig filterConfig)

    所有的filters会形成一个FilerChain,web服务器根据filter在web.xml中的注册顺序,依次执行dofilter方法(该方法会传入FilterChain对象),每个filter的dofilter方法都会有chain.dofilter( , )这行代码,产生的效果为:如果这不是最后一个filter,那么就向下继续执行下一个filter的dofilter方法,否则将请求发送到servlet中进行响应。httpservletResponse依次经过filter相反的顺序返回给浏览器。

    filter在web.xml中的配置(以struts为例)

    注:filter只会拦截符合url-pattern的请求模式属于dispatcher标签的请求。

    <filter>
           <filter-name>struts2</filter-name>      
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
     <filter-mapping>
           <filter-name>struts</filter-name>
           <!-- 所有的url都会被url过滤器解析 -->
           <url-pattern>/*</url-pattern>
    <!--forward表示只过滤内部转发的请求-->
           <dispatcher>FORWARD</dispatcher>
    <!--request表示只过滤客户端的请求-->
           <dispatcher>REQUEST</dispatcher>
        </filter-mapping>

    filter与servlet关系

         filter可以认为是Servlet的一种“加强版”,它主要用于对HttpServletRequest进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链(filterChain)。但它不能对请求做出响应,这是与servlet的最大区别。

     StrutsPreparedAndExcutedFilter   

         在该filer的init()方法中,会加载struts.properties文件和struts.xml等文件,在dofilter方法中,会创建一个ActionContext对象(该对象可以与servlet api进行交互),并根据请求的action映射到实际资源,在struts中该filter和action充当控制器的作用。

    Interceptor(对比filter理解)

    • void init():在该拦截器被实例化之后,在该拦截器执行拦截之前,系统将回调该方法。对于每个拦截器而言,其init()方法只执行一次。因此,该方法的方法体主要用于初始化资源。
    • void destory():该方法与init()方法对应。在拦截器实例被销毁之前,系统将回调该拦截器的destory方法,该方法用于销毁在init方法里打开的资源。
    • String intercept(ActionInvocation invocation):这个方法具备以下2层含义:
      1. ActionInvocation是ActionProxy实例化的,封装了关于action以及相关Interceptor的信息。
      2. 如果拦截器堆栈中还有其他的Interceptor,那么invocation.invoke()将调用堆栈中下一个Interceptor的执行。
      3. 如果拦截器堆栈中只有Action了,那么invocation.invoke()将调用Action执行。

      所以,我们可以发现,invocation.invoke()这个方法其实是整个拦截器框架的实现核心。基于这样的实现机制,我们还可以得到下面2个非常重要的推论:

      1. 如果在拦截器中,我们不使用invocation.invoke()来完成堆栈中下一个元素的调用,而是直接返回一个字符串作为执行结果,那么整个执行将被中止。
      2. 我们可以以invocation.invoke()为界,将拦截器中的代码分成2个部分,在invocation.invoke()之前的代码,将会在Action之前被依次执行,而在invocation.invoke()之后的代码,将会在Action之后被逆序执行。

      由此,我们就可以通过invocation.invoke()作为Action代码真正的拦截点,从而实现AOP(切面编程)。

    Interceptor和Filter区别与联系

    1.filter通过chain.dofilter()进行函数回调,而Interceptor是基于java反射的

    2.filter存在于servlet容器中,Intercept不然独立web容器

    3.filter作用于servlet,即几乎对所有请求都有过滤作用,而intercepor只对action请求起作用

    4.在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

    5.都是aop思想的实现

  • 相关阅读:
    QT窗体程序设置成不可改变大小,并生成在Linux下可双击执行的程序文件
    QT新建一个窗口控制程序,以实现添加按钮点击弹出信息提示框为例
    C# 模拟Http请求、下载
    thingsboard改造使用mysql数据库
    Redis单机版分布式锁实现
    利用jvisualvm使用btrace进行线上调试案例
    Btrace官方教程-中文版
    Powerdesigner16 逆向 postgresql9.2
    Linux java进程无故被kill
    thingsboard填坑之路
  • 原文地址:https://www.cnblogs.com/kundeg/p/6534900.html
Copyright © 2011-2022 走看看