一个FilterChain包括多个Filter。客户端请求request在抵达Servlet之前会经过FilterChain里的所有Filter,服务器响应response在从Servlet抵达客户端浏览器之前也会经过FilterChain里的所有Filter。
一个Filter必须实现javax.servlet.Filter接口。Filter的生命周期:init()和destroy方法只会被调用一次,分别在Web程序加载或者卸载的时候调用。而doFilter()方法每次有客户端请求都会被调用一次。Filter的所有工作也都集中中doFilter()方法中。
doFilter()方法中一定要执行chain.doFilter(request,response).否则request不会交给后面的Filter或者Servlet.
Filter需要配置在web.xml中才能生效。一个Filter需要配置<filter>
与filter-mapping
标签。
多个Filter的执行顺序有先有后。规则是<filter-mapping
配置在前面的Filter执行要早于配置在后面的Filter。另外要注意,多个Filter可能会相互影响。
Filter的经典案例
字符编码Filter是最常用的Filter之一,常用来解决Tomcat等服务器里request,response乱码问题。字符编码Filter是在request提交到Servlet之前对request进行指定编码方式的编码。
日志记录Filter:记录日志也是Filter擅长的工作之一。在request之前与之后都可以记录日志。该日志记录Filter使用apache的日志工具记录日志,记录客户的IP地址,访问的URL以及消耗的时间。
异常捕捉Filter
Filter中,如果在chain.doFilter(request,response)上加一个try-catch语句,就能捕捉Servlet中抛出的可预料的与不可预料的异常,然后根据不同的异常进行不同的异常处理。
权限验证Filter
Java web程序一般使用session或者cookie来记录用户是否登录,以及该用户的权限。权限验证Filter是在将request提交给Servlet之前,对session或者cookie进行校验。如果没有相应的登录信息,或者权限不够,则进行相应的处理,比如抛出异常。