• Filter过滤器


    简述

      过滤器是在客户端与服务器目标资源之间的一道过滤技术过滤器的执行地位在servlet前,客户端发送请求时,会先经过Filter,再到达目标Servlet中;响应时会根据执行流程再次反向执行Filter,可以解决多个servlet共性代码冗余问题,例如乱码处理、登录验证

    代码实现

      filter是javaweb三大组件之一,如同servlet一样是一个类,自己定义的filter也需要实现一个接口Filter,并重现init、destory、doFilter三个方法,filter类写完后同学需要进行配置,和servlet一样可以在web.xml里进行配置,或者使用注解进行配置

    使用web.xml进行配置

      和servlet一样,就是将一个URL和类的位置进行一个关联,例如:

    <filter>
        <filter-name>myfilter</filter-name>
        <filter-class>hjj.web.servlet.test_filter.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>myfilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

      需要注意url的写法含义:

     具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
     拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
    后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
    拦截所有资源:/* 访问所有资源时,过滤器都会被执行

      我们还可以进行拦截方式的配置,例如我们只拦截浏览器发送的请求,对于服务器内部资源的转发我们就不拦截,对于web.xml我们可以进行<dispatcher></dispatcher>标签进行拦截方式的配置

    REQUEST 默认值。浏览器直接请求资源
    FORWARD 转发访问资源
    INCLUDE 包含访问资源
    ERROR 错误跳转资源
    ASYNC 异步访问资源

     

    <filter>
        <filter-name>myfilter</filter-name>
        <filter-class>hjj.web.servlet.test_filter.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>myfilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

    基于注解的配置

      过滤器注解使用@WebFilter配置

      url的配置使用 filterName = "url" 配置

      拦截的方式用 dispatcherTypes = DispatcherType.类型 配置

    @WebFilter(filterName = "MyFilter",dispatcherTypes = DispatcherType.REQUEST)

      值得注意的是拦截方式我们可以配置多个

    Filter的生命周期

      当服务器启动时会创建filter对象,然后调用init方法,init方法只会执行一次。

      每当客户端访问合适的被拦截的路径时,filter会执行doFilter方法。

      当服务器关闭时,会调用filter的destory方法

    配置多个过滤器

      过滤器可以进行嵌套,可以对对过滤器的请求进行拦截

      注意当目标资源响应的时候时从后往前传的

      当多个过滤器拦截的url都适用的时候,过滤器的执行顺序是怎么样的呢?

    用注解配置 按照类名的字符串字典序比较规则比较,值小的先执行
    web.xml配置 按照各自的<filter-mapping>定义顺序执行
    一点一点积累,一点一点蜕变!
  • 相关阅读:
    将不确定变成确定~LINQ DBML模型可以对应多个数据库吗
    将不确定变成确定~frameset页面不能正确加载
    System.Web.Caching.Cache删除某键后,希望同时触发其它动作(关键时刻,还是事件靠的住)
    Linq实体类的设计(解决了复合查询的问题,同时解决了LINQ上下文缓存问题)
    将不确定变成确定~LINQ查询两种写法,性能没有影响,优化查询应该是“按需查询”
    ASP.NET的内置对象
    Templating with JSF 2.0 Facelets
    IOS设计模式学习(1)设计模式初窥
    20个强大的jQuery翻书插件【 jQuery flipbook】
    linux网络编程之socket(十四):基于UDP协议的网络程序
  • 原文地址:https://www.cnblogs.com/qq2210446939/p/14938909.html
Copyright © 2020-2023  润新知