Filter过滤器
功能:
1、用来拦截传入的请求和传出的响应
2、修改或者以某种方式处理正在客户端和服务端直接交换的数据流
如何使用?
与使用Servlet相似,Filter是Java Web提供的一个接口,开发者只需要自定义一个类并且实现该接口即可
package com.filter;
import javax.servlet.*;
import java.io.IOException;
/**
* @author 毕晶
* @date 2022/9/22 19:57
*/
public class CharacterFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTF-8");
//过滤会中断请求,所以要使用filterChain.doFilter把请求再次发出去,即到了TestServlet这边,请求一直都是同一个请求
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
web.xml中
<filter>
<filter-name>character</filter-name>
<filter-class>com.filter.CharacterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>character</filter-name>
<url-pattern>/test</url-pattern>
<url-pattern>/login</url-pattern>
<!-- 可以一直加-->
</filter-mapping>
也可以通过注解的方式来配置
@WebFilter("/checkLogin")
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter");
filterChain.doFilter(servletRequest, servletResponse);
}
}
Filter的生命周期
当Tomcat启动时,通过反射机制调用doFilter的无参构造器创建实例化对象,同时调用init方法实现初始化,foFilter方法调用多次,当Tomcat服务关闭时,调用destroy来销毁Filter对象
无参构造器:只调用一次,当Tomcat启动时调用(Filter一定要在xml中进行配置)
init方法:只调用一次,当Filter的实例化对象创建完成之后调用
doFilter方法:调用多次,访问Filter的业务逻辑都写在其中
destroy:只调用一次,Tomcat关闭的时候调用
实际开发中Filter的使用场景
- 处理中文乱码
- 屏蔽敏感词
- 控制资源的访问权限