Filter 过滤器
功能:
1、用来拦截传入的请求和传出的响应。
2、修改或以某种方式处理正在客户端和服务端之间交换的数据流。
使用示例:
与使用 Servlet 类似,Filter 是 Java WEB 提供的一个接口,开发者只需要自定义一个类并且实现该接口即可。
public class CharacterFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
}
<filter>
<filter-name>character</filter-name>
<filter-class>com.blu.filter.CharacterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>character</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Filter 的生命周期
当 Tomcat 启动时,通过反射机制调用 Filter 的无参构造函数创建实例化对象,同时调用 init 方法实现初始化,doFilter 方法调用多次,当 Tomcat 服务关闭的时候,调用 destory 来销毁 Filter 对象。
Filter的调用顺序
同时配置多个 Filter时,Filter 的调用顺序是由 web.xml 中的配置顺序来决定的,写在上面的配置先调用,因为 web.xml 是从上到下顺序读取的。
使用注解简化 Filter 配置
注:使用注解方式配置 Filter 无法控制 Filter的调用顺序
@WebFilter("/*")
public class CharacterFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
}
Filter的使用场景
1、统一处理中文乱码
2、屏蔽敏感词
3、控制资源的访问权限
屏蔽敏感词示例:
@WebFilter("/login")
public class WordFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
String name = request.getParameter("name");
name = name.replaceAll("敏感词", "***");
request.setAttribute("name", name);
chain.doFilter(request, response);
}
}
访问权限控制示例:
@WebFilter("/download.jsp")
public class DownloadFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
HttpSession session = httpRequest.getSession();
String name = (String) session.getAttribute("name");
if(name == null) {
//不是登录状态
httpResponse.sendRedirect("/login.jsp");
}else {
chain.doFilter(request, response);
}
}
}