工作原理
过滤器顾名思义,一个容器可以将一堆东西经过过滤筛选去除不想要的部分,保留想要的部分。就如同净水器一样,将水中的杂质过滤,保留纯净的饮用水。而Java中的过滤器是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理。通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理。
创建过滤器
创建过滤器类FilterTest实现javax.servlet.Filter,该接口主要有三个方法,doFilter()方法是业务处理的核心代码区,用来编写过滤的条件逻辑。
方法一:配置web.xml文件
在web.xml文件中配置以下内容,就可以创建并使用过滤器了
<!--配置过滤器--> <filter> <filter-name>FilterTest</filter-name> <filter-class>com.example.demo.Filter.FilterTest</filter-class> </filter> <!--映射过滤器--> <filter-mapping> <filter-name>FilterTest</filter-name> <!--“/*”表示拦截所有的请求 --> <url-pattern>/*</url-pattern> </filter-mapping>
方法二:使用@WebFilter注解
Spring boot较之于MVC最大的好处就是将很多配置文件使用了注解来代替,大大方便了开发,使用方法如下所示
package com.example.demo.Filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;/*** @author zhangqianwei* @date 2021/8/9 11:20*/
@WebFilter(filterName = "FilterTest",urlPatterns = "/*",initParams = {@WebInitParam(name = "charset",value = "utf-8")})
public class FilterTest implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {/*初始化方法 接收一个FilterConfig类型的参数 该参数是对Filter的一些配置*/}@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {/*过滤方法 主要是对request和response进行一些处理,然后交给下一个过滤器或Servlet处理*/chain.doFilter(req, res);//交给下一个过滤器或servlet处理}@Overridepublic void destroy() {/*销毁时调用*/}
}
@WebFilter
用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。该注解具有下表给出的一些常用属性 ( 以下所有属性均为可选属性,但是 value、urlPatterns、servletNames 三者必需至少包含一个,且 value 和 urlPatterns 不能共存,如果同时指定,通常忽略 value 的取值 )
重点讲一下下面两个配置项
urlPatterns:这是用来描述过滤器的作用域,配置要拦截的资源
- 以指定资源匹配。例如
"/index.jsp"
- 以目录匹配。例如
"/servlet/*"
- 以后缀名匹配,例如
"*.jsp"
- 通配符,拦截所有web资源。
"/*"
initParams:
用来配置一些初始化参数,例如编码格式等
需要注意的是
过滤器是在服务器启动时就会创建的,只会创建一个实例,常驻内存,也就是说服务器一启动就会执行Filter的init(FilterConfig config)方法.
当Filter被移除或服务器正常关闭时,会执行destroy方法
至于多个Filter的执行顺序可以参考下文:
https://blog.csdn.net/yuzhiqiang_1993/article/details/81288912