zoukankan      html  css  js  c++  java
  • 过滤器链

    ---------------siwuxie095

       

       

       

       

       

       

       

       

    一个 Web 应用中可以一次编写多个过滤器,这些过滤器的组合

    称之为 过滤器链

       

    在过滤器链中,过滤器的执行顺序依据过滤器在部署描述符 web .xml 中

    注册的顺序

       

       

    过滤器链体现了一种职责链模式,是设计模式中的一种

       

       

    职责链模式:

       

    能够使多个对象,都有机会处理请求,它将多个对象连成一个链条,

    并沿着这个链条传递请求,直到有一个对象最终处理它为止

       

       

    职责链模式能够避免请求的发送者和接受者之间的耦合关系

       

       

    对于过滤器而言,请求传递给具体的 Web 资源之前,都会经过

    过滤器的处理,在 Web 资源处理完该请求之后-返回响应给客户

    端之前,响应信息也会被过滤器处理一遍

       

       

       

       

    一个简单的过滤器链实例:

       

    访问指定资源之前打印若干日志,访问指定资源之后再打印若干日志

       

       

    点击选择工程名,右键->New->Filter,包名为:com.siwuxie095.filter,

    类名为:FilterOne、FilterTwo

       

       

       

    FilterOne.java:

       

    package com.siwuxie095.filter;

       

    import java.io.IOException;

       

    import javax.servlet.Filter;

    import javax.servlet.FilterChain;

    import javax.servlet.FilterConfig;

    import javax.servlet.ServletException;

    import javax.servlet.ServletRequest;

    import javax.servlet.ServletResponse;

       

       

    public class FilterOne implements Filter {

       

     

    public FilterOne() {

    System.out.println("===== FilterOne 构造方法 =====");

    }

     

     

    public void init(FilterConfig fConfig) throws ServletException {

    System.out.println("===== FilterOne 初始化方法 =====");

    String initParam=fConfig.getInitParameter("param");

    System.out.println("param = "+initParam);

    }

       

     

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

    System.out.println("===== 开始执行FilterOne doFilter方法 =====");

    chain.doFilter(request, response);

    System.out.println("===== 结束执行FilterOne doFilter方法 =====");

    }

       

     

    public void destroy() {

    System.out.println("===== FilterOne 销毁方法 =====");

    }

       

    }

       

       

       

    FilterTwo.java:

       

    package com.siwuxie095.filter;

       

    import java.io.IOException;

       

    import javax.servlet.Filter;

    import javax.servlet.FilterChain;

    import javax.servlet.FilterConfig;

    import javax.servlet.ServletException;

    import javax.servlet.ServletRequest;

    import javax.servlet.ServletResponse;

       

    /**

    * 多个过滤器组合起来,为过滤器链

    * 在过滤器链中,过滤器的执行顺序是部署描述符中注册的顺序

    *

    * 过滤器链体现了一种职责链模式 是设计模式中的一种

    */

    public class FilterTwo implements Filter {

       

     

    public FilterTwo() {

    System.out.println("===== FilterTwo 构造方法 =====");

    }

       

     

    public void init(FilterConfig fConfig) throws ServletException {

    System.out.println("===== FilterTwo 初始化方法 =====");

    }

       

     

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

    System.out.println("===== 开始执行FilterTwo doFilter方法 =====");

    chain.doFilter(request, response);

    System.out.println("===== 结束执行FilterTwo doFilter方法 =====");

    }

     

     

    public void destroy() {

    System.out.println("===== FilterTwo 销毁方法 =====");

    }

       

    }

       

       

       

    在部署描述符 web.xml 中注册 filter:

       

    <?xml version="1.0" encoding="UTF-8"?>

    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">

    <display-name>MyServlet</display-name>

    <welcome-file-list>

    <welcome-file>index.html</welcome-file>

    <welcome-file>index.htm</welcome-file>

    <welcome-file>index.jsp</welcome-file>

    <welcome-file>default.html</welcome-file>

    <welcome-file>default.htm</welcome-file>

    <welcome-file>default.jsp</welcome-file>

    </welcome-file-list>

     

    <filter>

    <filter-name>FilterOne</filter-name>

    <filter-class>com.siwuxie095.filter.FilterOne</filter-class>

    <init-param>

    <param-name>param</param-name>

    <param-value>siwuxie095</param-value>

    </init-param>

    </filter>

    <filter-mapping>

    <filter-name>FilterOne</filter-name>

    <url-pattern>/*</url-pattern>

    </filter-mapping>

       

    <filter>

    <filter-name>FilterTwo</filter-name>

    <filter-class>com.siwuxie095.filter.FilterTwo</filter-class>

    </filter>

    <filter-mapping>

    <filter-name>FilterTwo</filter-name>

    <url-pattern>/*</url-pattern>

    </filter-mapping>

     

    </web-app>

       

       

    部署描述符 web.xml 在 WEB-INF 目录下,如果没有,手动创建即可

       

    点击选择工程名,右键->Java EE Tools->Generate Deployment Descriptor Stub

       

       

       

    启动 Tomcat 时,过滤器的执行:

       

       

       

       

       

       

       

    【made by siwuxie095】

  • 相关阅读:
    leetcode 48. Rotate Image
    leetcode 203. Remove Linked List Elements 、83. Remove Duplicates from Sorted List 、82. Remove Duplicates from Sorted List II(剑指offer57 删除链表中重复的结点) 、26/80. Remove Duplicates from Sorted ArrayI、II
    leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes
    leetcode 58. Length of Last Word
    安卓操作的一些问题解决
    leetcode 378. Kth Smallest Element in a Sorted Matrix
    android studio Gradle Build速度加快方法
    禁用gridview,listview回弹或下拉悬停
    Android Studio找不到FragmentActivity类
    安卓获取ListView、GridView等滚动的距离(高度)
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6716489.html
Copyright © 2011-2022 走看看