作用:可以动态的过滤请求 request 或者回复 response。
- 在客户端(Web端)发送请求到服务器之前,过滤处理请求 request;
- 在服务端回复请求到客户端(Web端)之前,过滤处理回复 response。
用法:可以将一个或者多个 Filter 加到一个或者多个网络资源上。
创建 Filter 文件
- 创建一个类,实现 Filter 接口;
- 重写 接口中的方法 —— 重点是 doFilter 方法;
- 配置 web.xml / @WebFilter注解
一个 Filter 加到多个网络资源上的 web.xml 配置代码:
<filter>
<filter-name>Filter1</filter-name>
<filter-class>D20210128.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter1</filter-name>
<url-pattern>/TestServlet</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Filter1</filter-name>
<url-pattern>/D20210223/test.jsp</url-pattern>
</filter-mapping>
init 方法
init 方法什么时候被调用:服务器启动时就会被调用。
doFilter 方法
doFilter 方法的参数:
- ServletRequest request 和 ServletResponse response。注意这个和 Servlet 中参数很像,但不是一个东西,Servlet 中的参数分别是 HttpServletRequest 类型和 HttpSerlvetResponse 类型。
- FilterChain chain:Filter 链。如果是将多个 Filter 加到一个网络资源上的话,会加到同一个资源上的 Filter 构成一个链,所以链上的每一个项都是一个 Filter
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
}
FilterChain 参数有一个很重要的 方法:doFilter(request, response);
,表示放行当前过滤器——请求的路径可以进行资源访问,这个方法将 Filter 的 doFilter 方法的代码分为上下两个部分
注意,FilterChain 中的 doFilter 方法和 Filter 中的 doFilter 方法是两个完全不一样的东西,只是名字恰巧相同而已,没有任何关系。