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>谁定义在上边 谁先执行

 

posted @ 2020-07-02 16:37  梦三  阅读(2936)  评论(0编辑  收藏  举报