一 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>谁定义在上边 谁先执行
来源:oschina
链接:https://my.oschina.net/u/4324735/blog/4333545