本节书摘来异步社区《Java EE 7精粹》一书中的第2章,第2.2节,作者:【美】Arun Gupta,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.2 Servlet过滤器
Servlet过滤器用于更新进入Servlet的请求和走出Servlet的响应中的有效负载和头信息。过滤器不产生响应,他们只修改或适配请求和响应,认识到这一点是很重要的。Servlet过滤器的一些典型的用例包括身份验证、日志记录、数据压缩和加密。Servlet过滤器与Servlet封装在一起来处理动态或静态内容。
Servlet过滤器通过静态内容中指定的URL匹配模式与一个Servlet或一组Servlet相关联。可以使用@WebFilter注解来定义一个过滤器:
@WebFilter("/*")
public class LoggingFilter implements javax.servlet.Filter {
public void doFilter(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain){
// . . .
}
}```
在所示的代码中,LoggingFilter被应用到Web应用程序中的所有Servlet和静态内容页面。参数chain通过调用FilterChain.doFilter()方法继续处理过滤链。如果该方法没有被调用,过滤链上当前过滤器的下一个过滤器将不会被调用。
可以在@WebFilter使用@WebInitParam来指定过滤器的初始化参数。
过滤器和目标Servlet总是在相同的调用线程中执行。多个过滤器可以排列在一个过滤器链中。
还可以使用<filter>和一个<filter-mapping>元素在部署描述符文件中定义的过滤器:
<div style="text-align: center"><img src="https://yqfile.alicdn.com/f5ac5865be1a1bb36e777ee76047a4e1d820430b.png" width="" height="">
</div>
除了使用@WebFilter注解和web.xml来声明过滤器,也可以使用ServletContext. addFilter()方法,编程方式地定义过滤器。在ServletContainerInitializer.onStartup方法或ServletContextListener.contextInitialized方法中可以做到这一点。addFilter()方法的返回类型为ServletRegistration.Dynamic,该返回值可以用于添加映射URL匹配模式、设置初始化参数,以及处理其他配置项:
<div style="text-align: center"><img src="https://yqfile.alicdn.com/71fa6c79ac11b00b01d53b7f4c0d6d958604a696.png" width="" height="">