javaWeb---Filter

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("-------------------销毁过滤器对象");
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值