zoukankan      html  css  js  c++  java
  • Filter

    一 Filter简介

    Filter是JavaWeb三大组件之一 Web中的过滤器

    当访问服务器的资源时 过滤器可以将请求拦截下来 完成一些特殊的功能

    一般用于通用的操作 比如登录验证 统一编码处理 敏感字符过滤等等

    二 新建一个Filter

    1. 新建一个Web项目

    2. 自定义一个类 实现Filter接口

    /**
     * Filter快速入门
     * Created by Hy on 2020/7/2.
     */
    public class FilterDemo1 implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {}
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("doFilter() 前");
            // 放行
            filterChain.doFilter(servletRequest, servletResponse);
            System.out.println("doFilter() 后");
        }
    
        @Override
        public void destroy() {}
    }

    3. 配置Filter web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <!-- 配置Filter -->
        <filter>
            <filter-name>demo1</filter-name>
            <filter-class>com.hy.filter.FilterDemo1</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>demo1</filter-name>
            <!-- 拦截路径 -->
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    </web-app>

    启动项目 访问 http://localhost:8080/index.jsp

    三 Filter执行流程

    执行过滤器 -> 执行放行后的资源 -> 回来执行过滤器放行代码下边的代码

    四 Filter生命周期

    /**
     * Filter生命周期
     * Created by Hy on 2020/7/2.
     */
    public class FilterDemo2 implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            // 生命周期方法 创建
            // 在Filter被创建时执行 只会执行一次
            System.out.println("init()");
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            // 生命周期方法 拦截资源
            // 每一次请求被拦截时执行 执行多次
            System.out.println("doFilter()");
            // 放行
            filterChain.doFilter(servletRequest, servletResponse);
        }
    
        @Override
        public void destroy() {
            // 生命周期方法 销毁
            // 在服务器正常关闭时执行 只会执行一次
            System.out.println("destroy()");
        }
    }

    1. 被创建 执行init() 只会执行一次

    在服务器启动时创建

    2. 拦截资源 执行doFilter() 执行多次

    每次请求被拦截时 doFilter()都会被调用一次

    3. 被销毁 执行destroy() 只会执行一次

    Filter被销毁前执行 服务器正常关闭时 Filter被销毁

    五 Servlet3.0注解

    使用注解代替web.xml配置

    /**
     * Servlet3.0注解
     * 拦截路径定义规则
     * 1. /index.jsp 具体资源路径 只有访问index.jsp资源时 过滤器才会被执行
     * 2. /user/*    拦截目录 访问/user下的所有资源时 过滤器都会被执行
     * 3. *.jsp 扩展名拦截 访问所有扩展名为jsp资源时 过滤器都会被执行
     * 4. /* 拦截所有资源 访问所有资源时 过滤器都会被执行
     *
     * 拦截方式配置 资源被访问的方式
     * 设置dispatcherTypes属性
     * 1. REQUEST 默认值 浏览器直接请求资源
     * 2. FORWARD 转发访问资源
     * 3. INCLUDE 包含访问资源
     * 4. ERROR 错误跳转资源
     * 5. ASYNC 异步访问资源
     * 注意: web.xml配置 -> 设置<dispatcher></dispatcher>标签即可
     * Created by Hy on 2020/7/2.
     */
    //@WebFilter("/*")
    @WebFilter(urlPatterns = "/*", dispatcherTypes = DispatcherType.REQUEST)
    public class FilterDemo3 implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("init...");
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("doFilter...");
            // 放行
            filterChain.doFilter(servletRequest, servletResponse);
        }
    
        @Override
        public void destroy() {
            System.out.println("destroy...");
        }
    }

     六 过滤器链

    1. 执行顺序 如果有两个过滤器 过滤器1和过滤器2

    过滤器1 -> 过滤器2 -> 资源执行 -> 过滤器2 -> 过滤器1

    2. 过滤器先后顺序问题

    a. 注解配置

      按照类名的字符串比较规则 值小的先执行 比如AFilter和BFilter AFilter就先执行

    b. web.xml配置

      <filter-mapping>谁定义在上边 谁先执行

  • 相关阅读:
    Linux定时运行程序脚本
    git tips
    Python循环
    Head First Design Patterns
    animation过渡效果
    图像处理池化层pooling和卷积核
    TensorFlow的梯度裁剪
    神经网络优化方法总结:SGD,Momentum,AdaGrad,RMSProp,Adam
    CNN网络架构演进
    TensorFlow object detection API应用
  • 原文地址:https://www.cnblogs.com/huangyi-427/p/13225587.html
Copyright © 2011-2022 走看看