Filter
过滤器要实现 javax.servlet.Filter 接口:
- 在 Web 资源被访问前,检查 request 对象,修改请求头和请求正文,或对请求进行预处理操作。
- 将请求传递到下一个过滤器或目标资源。
- 在 Web 资源被访问后,检查 response 对象,修改响应头和响应正文。
配置方式
- 注解
- Web.xml
Filter工作流程
1.客户端请求访问容器内的 Web 资源。
2.Servlet 容器接收请求,并针对本次请求分别创建一个 request 对象和 response 对象。
3.请求到达 Web 资源之前,先调用 Filter 的 doFilter() 方法,检查 request 对象,修改请求头和请求正文,或对请求进行预处理操作。
4.在 Filter 的 doFilter() 方法内,调用 FilterChain.doFilter() 方法,将请求传递给下一个过滤器或目标资源。
5.目标资源生成响应信息返回客户端之前,处理控制权会再次回到 Filter 的 doFilter() 方法,执行 FilterChain.doFilter() 后的语句,检查 response 对象,修改响应头和响应正文。
6.响应信息返回客户端。
生命周期
1.初始化阶段:
Servlet 容器负责加载和实例化 Filter。容器启动时,读取 web.xml 或 @WebFilter 的配置信息对所有的过滤器进行加载和实例化。
加载和实例化完成后,Servlet 容器调用 init() 方法初始化 Filter 实例。在 Filter 的生命周期内, init() 方法只执行一次。
2.拦截和过滤阶段:
该阶段是 Filter 生命周期中最重要的阶段。当客户端请求访问 Web 资源时,Servlet 容器会根据 web.xml 或 @WebFilter 的过滤规则进行检查。当客户端请求的 URL 与过滤器映射匹配时,容器将该请求的 request 对象、response 对象以及 FilterChain 对象以参数的形式传递给 Filter 的 doFilter() 方法,并调用该方法对请求/响应进行拦截和过滤。
3.销毁阶段:
Filter 对象创建后会驻留在内存中,直到容器关闭或应用被移除时销毁。销毁 Filter 对象之前,容器会先调用 destory() 方法,释放过滤器占用的资源。在 Filter 的生命周期内,destory() 只执行一次。
Filter 链中 Filter 的执行顺序
- 通过 web.xml 配置的 Filter 过滤器,执行顺序由 标签的配置顺序决定。 靠前,则 Filter 先执行,靠后则后执行。通过修改 的顺序便可以修改 Filter 的执行顺序。
- 通过 @WebFilter 注解配置的 Filter 过滤器,无法进行排序,若需要对 Filter 过滤器进行排序,建议使用 web.xml 进行配置。
代码
package …;
import …;
@WebFilter("/*")
public class Filter1 implements Filter{ //这里是给出Filter的一个实现类Filter1
public void destroy(){
//添加代码
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException,ServletException{
//添加代码
}
public void init(FilterConfig filterConfig) throws ServletException{
//添加代码
}
}
编码方式过滤
package filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {
/**
* 过滤器的执行方法
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("CharacterEncodingFilter---------执行过滤器方法");
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
HttpServletResponse resp=(HttpServletResponse)response;
resp.setHeader("content-type", "text/html;charset=utf-8");
chain.doFilter(request, response);
}
public CharacterEncodingFilter() {
System.out.println("-------------------实例化过滤器对象");
}
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("-------------------初始化过滤器对象");
}
public void destroy() {
System.out.println("-------------------销毁过滤器对象");
}
}