1. 功能
1.1 功能介绍1.2 使用方法 2. 配置
2.1 方法1 xml配置2.2 方法2 注解 3. Filter生命周期
3.1 测试代码3.2 结果展示3.3 两个Filter的调用顺序3.4 小结 4. 过滤器使用场景
4.1 案例(屏蔽敏感词)
1. 功能 1.1 功能介绍用来拦截传入的请求和传出的响应。修改或以某种方式处理正在客户端和服务端之间交换的数据流。 1.2 使用方法
与使用Servlet类似,Filter是Java WEB提供的一个接口,开发者只需要自定义一个类并且实现该接口即可。
2. 配置 2.1 方法1 xml配置xml
character filter.CharacterFilter character /Login /test
CharacterFilter
public class CharacterFilter implements Filter{
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
// TODO Auto-generated method stub
servletRequest.setCharacterEncoding("utf-8");
filterChain.doFilter(servletRequest, servletResponse);
}
}
注: doFilter方法中处理完业务逻辑之后必须添加filterChain.doFilter(servletRequest, servletResponse);否则请求/响应无法向后传递,一直停留在过滤器中。
2.2 方法2 注解@WebFilter("Login")
3. Filter生命周期
3.1 测试代码
加上2.1中的代码
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;
public class CharacterFilter implements Filter{
public CharacterFilter() {
System.out.println("通过无参数构造创建了对象");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destory...");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("doFilter...");
servletRequest.setCharacterEncoding("utf-8");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
System.out.println("init...");
}
}
3.2 结果展示
配置完成后,当Tomcat启动时,通过反射机制调用Filter的无参构造函数创建实例化对象,同时调用init方法执行初始化操作。
中间可以很多次调用doFilter方法。
当关掉Tomcat服务后,便会调用destory方法,来销毁Filter对象。
3.3 两个Filter的调用顺序character filter.CharacterFilter character /Login /test my filter.MyFilter my /Login
如果设置两个Filter,按照在web.xml中的顺序调用,比如在上述代码中,先调用character,再调用my。
3.4 小结无参数构造函数
只调用一次,当Tomcat启动时调用(Filter一定要进行配置)init方法
只调用一次,当Filter的实例化对象创建完成之后调用doFilter方法
调用多次,访问Filter的业务逻辑都写在Filter中destory方法
只调用一次,Tomcat关闭时调用多个Filter的调用顺序
同时配置多个Filter,Fliter的调用顺序是由web.xml中的配置顺序来决定的,卸载上面的配置先调用,因为web.xml是从上到下顺序读取的。
4. 过滤器使用场景
统一处理中文乱码屏蔽敏感词控制资源的访问权限 4.1 案例(屏蔽敏感词)
WordFilter
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
// 将敏感词换成"**"
String name = servletRequest.getParameter("name");
System.out.println(name+"1");
name = name.replaceAll("敏感", "**");
System.out.println(name+"2");
filterChain.doFilter(servletRequest, servletResponse);
}
test.jsp
<%@page import="bysj01.User"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
Insert title here
结果展示



