一 Filter简介
Filter是JavaWeb三大组件之一 Web中的过滤器
当访问服务器的资源时 过滤器可以将请求拦截下来 完成一些特殊的功能
一般用于通用的操作 比如登录验证 统一编码处理 敏感字符过滤等等
二 新建一个Filter
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>谁定义在上边 谁先执行