1. 过滤器 Filter
1.1 Filter 定义
Filter是sun公司中servlet2.3后增加的一个新功能,在javaEE中定义了一个接口 javax.servlet.Filter来描述过滤器。
Filter可以认为是Servlet的一种“加强版”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序.它依赖于servlet容器,在实现上,基于函数回调,它可以对几乎所有请求进行过滤。
1.2 Filter 工作原理
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一处理等。
使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
- 当服务器启动,会创建Filter对象,并调用init方法,只调用一次。
- 当访问资源,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,
- 当服务器关闭时,会调用Filter的destroy方法来进行销毁操作。
1.3 Filter 应用场景
在过滤器中修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的一些参数(XSSFilter(自定义过滤器)),如:过滤低俗文字、危险字符、敏感词过滤、响应信息压缩、控制权限、控制转向、做一些业务逻辑判断等。
1.4 Filter 实例
1.定义 Filter
package com.demo.filter;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import java.io.IOException;
/**
* @author gx
*/
@Component
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
System.out.println("这是 myFilter 过滤器!");
filterChain.doFilter(request, response);
System.out.println("这是 myFilter 过滤器执行后!");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("这是 myFilter 初始化");
}
@Override
public void destroy() {
System.out.println("这是 myFilter 销毁");
}
}
2. 配置过滤器
- 方式一:web.xml
<filter>
<description>测试过滤器</description>
<filter-name>TestFilter</filter-name>
<filter-class>com.test.filtes.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 方式二:通过@WebFilter注解配置
@WebFilter(urlPatterns = "/*")
@Component
public class MyFilter2 implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
System.out.println("这是 myFilter2 过滤器!");
filterChain.doFilter(request, response);
System.out.println("这是 myFilter2 过滤器执行后!");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("这是 myFilter2 初始化");
}
@Override
public void destroy() {
System.out.println("这是 myFilter2 销毁");
}
}
启动类上可能需要这个注解:@ServletComponentScan