• 15.Filter(过滤器)


    1.管理所有WEB资源:(Jsp, Servlet, 静态图片文件或静态 html 文件等)文件等进行拦截,从而实现一些特殊的功能

    2.Filter接口中有一个doFilter方法,当我们编写好Filter,并配置(WEB.XML)对哪个web资源进行拦截后,

      WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

    调用目标资源之前,让一段代码执行。(如对request和response进行预处理 解决编码问题)

    是否调用目标资源(即是否让用户访问web资源)。

    调用目标资源之后,让一段代码执行。(如事务的提交 压缩发送到服务器的数据等)

    3.Filter开发步骤:

    Filter开发分为二个步骤:

      1.编写java类实现Filter接口,并实现其doFilter方法。

      2.在 web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。

    4.Filter执行顺序 (Filter执行链)

    Filter在web.xml文件中注册的顺序,决定了其在Filter执行链中的位置,首先执行注册在最前面的Filter

    1 System.out.println("filterdemo1执行前!!!");
    2         
    3 //在执行到chain.doFilter方法,会去看,后面是否还有过滤器,如果有,先执行下一个Filter的 doFilter,后面回过头来再执行chain.doFilter
    4 chain.doFilter(request, response);  //让目标资源执行,放行
    5         
    6 System.out.println("filterdemo1执行后!!!");

      1.filter1执行前

      2.filter2执行前

      3.servlet执行

      4.filter2执行后

      5.filter1执行后

    调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,

    如果有,则立即调用第2个filter,如果没有,则立即调用目标资源。 /*注:chain.doFilter(request,response) 执行后,立即放行,这行代码后面的语句,会等目标执行完后,再执行*/

    5.Filter生命周期(类似于servlet)由WEB服务器负责 /*创建和销毁都只执行一次*/

      1.Filter的创建(WEB服务器启动)web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能

      2.Filter的销毁(WEB服务器关闭) Web容器调用destroy方法销毁Filter

      3.通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。

    6.映射Filter

      <filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
      <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
      <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
      <servlet-name>指定过滤器所拦截的Servlet名称。
      <dispatcher>指定过滤器所拦截的资源被 Servlet 容器 /*调用的方式*/,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。

      用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。

    /*Filter高级*/

    7.包装设计模式 (当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强)

      1.编写子类 覆盖需增强的方法
      2.使用包装设计模式对方法进行增强(优先考虑)

     1 /*
     2 1.实现与被增强对象相同的接口 
     3 2、定义一个变量记住被增强对象
     4 3、定义一个构造器,接收被增强对象
     5 4、覆盖需要增强的方法
     6 5、对于不想增强的方法,直接调用被增强对象(目标对象)的方法
     7  */
     8  
     9 class MyCharacterEncodingRequest extends HttpServletRequestWrapper{
    10     
    11     private HttpServletRequest request;
    12     public MyCharacterEncodingRequest(HttpServletRequest request) {
    13         super(request);
    14         this.request = request;
    15     }
    16     @Override
    17     public String getParameter(String name) {
    18         
    19         try{
    20             String value= this.request.getParameter(name);
    21             if(value==null){
    22                 return null;
    23             }
    24             
    25             if(!this.request.getMethod().equalsIgnoreCase("get")) {
    26                 return value;
    27             }
    28             
    29             value = new String(value.getBytes("ISO8859-1"),this.request.getCharacterEncoding());
    30             return value;
    31             
    32         }catch (Exception e) {
    33             throw new RuntimeException(e);
    34         }
    35     }
    36 }

        1.首先看需要被增强对象继承了什么接口或父类,编写一个类也去继承这些接口或父类。
        2.在类中定义一个变量,变量类型即需增强对象的类型。
        3.在类中定义一个构造函数,接收需增强的对象。
        4.覆盖需增强的方法,编写增强的代码。
        5.不想增强的方法,直接调用被增强对象(目标对象)的方法

    8.使用Decorator设计模式增强request对象(默认有这样一个实现类HttpServletRequestWrapper,让你自由发挥)

    (new一个自己的Request类,继承HttpServletRequestWrapper,然后在放行时使用(chain.doFilter(自己的request,response)))

      1.使用Decorator模式包装request对象解决get和post请求方式下的中文乱码问题

      1.使用Decorator模式包装request对象实现html标签转义功能

      3.使用Decorator模式包装request对象实现敏感字符过滤功能

    如果将这三个过滤器联合起来使用(都用于增强getParameter方法),那么就相当于是把request对象包装了3次,request对象的getParameter方法经过3次重写,

    使得getParameter方法的功能大大增强,可以同时解决中文乱码,html标签转义,敏感字符过滤这些需求。


    9.使用Decorator设计模式增强response对象(HttpServletResponseWrapper)

      1.response增强案例——压缩响应正文内容

      2.response增强案例——缓存数据到内存

  • 相关阅读:
    Asp.NET调用有道翻译API
    JSON C# Class Generator ---由json字符串生成C#实体类的工具
    让jQuery的contains方法不区分大小写
    javascript parseUrl函数(来自国外的获取网址url参数)
    typescript
    webpack 第二部分
    express node 框架介绍
    webpack 最新版
    es6 字符串 对象 拓展 及 less 的语法
    es6 的数组的方法
  • 原文地址:https://www.cnblogs.com/xuzekun/p/7359481.html
Copyright © 2020-2023  润新知