一、Filter概述
- Filter过滤器
Filter意为滤镜或者过滤器,用于在Servlet之外对request或者response进行修改。
Filter提出了滤镜链(FilterChain)的概念,一个FilterChain包括多个Filter。
客户端请求request在抵达Servlet之前会经过FilterChain里的所有Filter,
服务器响应response在从Servlet抵达客户端浏览器之前
也会经过FilterChain里的所有Filter。 - Filter接口
一个Filter必须实现javax.servlet.Filter接口。
Filter接口有3个方法:init()、doFilter()和destroy()方法。
其中init()与destroy()方法只会被调用一次,
分别在Web程序加载或者卸载的时候调用。
而doFilter()方法每次有客户端请求都会被调用一次。
Filter的所有工作也都集中在doFilter()方法中。
chain.doFilter(request, response)将request递交给FilterChain中的
下一个Filter,如果所有的Filter都走完了则交给Servlet处理。 - Filter配置
Filter需要配置在web.xml中才能生效。
一个Filter需要配置<filter>与<filter-mapping>标签。
<filter>
<filter-name>filterName</filter-name>
<filter-class><filter.MyFilter</filter-class>
<init-param>
<param-name>paramName</param-name>
<param-value><paramValue</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filterName</filter-name>
<url-pattern>/jsp/*</url-pattern>
<url-pattern>*.do</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter>配置Filter名称,实现类以及初始化参数(如果有的话)。
可同时配置多个初始化参数。
<filter-mapping>配置什么规则下使用该Filter。
<url-pattern>配置URL的规则,可以配置多个,可以使用通配符(*)。
<dispatcher>配置到达Servlet的方法,
有4种取值:REQUEST、FORWARD、INCLUDE、ERROR。
可以同时配置多个<dispatcher>。
如果没有配置任何<dispatcher>,默认REQUEST。它们的区别是:
REQUEST:表示仅当直接请求Servlet时才生效。
FORWARD:表示仅当某Servlet通过FORWARD到该Servlet时才生效。
INCLUDE:JSP中可以通过<jsp:include/>请求某Servlet。
仅这种情况下才有效。
ERROR:JSP中可以通过<%@ page errorPage="error.jsp" %>
指定错误处理页面。仅在这种情况下才有效。
<url-pattern>和<dispatcher>的关系是“且”的关系。
<filter>的filterName与<filter-mapping>的filterName必须匹配。
二、Filter经典案例
- 防盗链Fitler
防盗链Filter实现这样一种效果,如果其他的网站引用本网站的图片资源,
将会显示一个错误图片。只有本站内的网页引用时,图片才会正常显示。
即在图片显示之前对request进行验证,看客户请求是否来自本网站内。 - 字符编码Filter
字符编码Filter是最常用的Filter之一,
常用来解决Tomcat等服务器里request、response乱码的问题。字符编码
Filter是在request提交到Servlet之前对request进行制定编码方式的编码。 - 日志记录Filter
记录日志也是Filter擅长的工作之一,
在request之前与之后都可以记录日志。
记录客户的IP地址,访问的URL以及消耗的时间 - 异常捕捉Filter
Filter中,如果在chain.doFilter(request,response)上加一个try...catch语句,
就能捕捉Servlet中抛出的可预料的与不可预料的异常,
然后根据不同的异常进行不同的异常处理。 - 权限验证Filter
Java Web程序一般使用session或者cookie来记录用户是否登录,以及该用户的权限。
权限验证Filter是在将request提交给Servlet之前,对session或者cookie
进行校验。如果没有相应的登录信息,或者权限不够,则进行相应的处理。
如果只检查是否登录,则只检查session或cookie中有没有相应的信息即可。
如果要检查权限,则需要一个URI与权限角色的检查规则。 - 内容替换Filter
内容替换Filter的工作原理是,在Servlet将内容输出到response时,
response将内容缓存起来,在Filter中进行替换,然后再输出到客户端浏览器。 - GZIP压缩Filter
网站常使用GZIP压缩算法对网页内容进行压缩,
然后传给浏览器,以减少数据传输量、提高响应速度。
浏览器接收到GZIP压缩数据后会自动解压并正确显示。
GZIP加速常用来解决网速慢的瓶颈。 - 图像水印Filter
Filter也常用做图像处理。工作原理跟GZIP压缩类似,
先把图像数据缓存起来,然后对图像数据进行水印处理后输出到客户端浏览器。 - 缓存Filter
缓存Filter的工作流程为:
(1)截获浏览器提交的request;
(2)如果request为POST方式,则不经过缓存;
(3)如果request为GET方式,且请求的页面有缓存并且缓存没有过期,
则直接返回缓存结果,这样就避免了读取数据库。
(4)如果没有缓存或者缓存已过期,则重新请求Servlet,
将Servlet返回的内容缓存并输出到客户端浏览器。 - XSLT转换Filter
XSLT转换是XML文件的功能之一,是利用XSLT样式文件将XML文件转换为其他格式。 - 文件上传Filter
有时候默认的request不能满足需求,这时就需要自定义request。
自定义一个request,
不仅能够通过request.getParameter(fieldname)获取普通文本域,
还能通过request.getAttribute(fieldname)直接获取上传的文件。
原理是先判断原request是否为multipart格式,如果不是,则不作任何处理。
如果是,则使用apache的uploading工具解析,放到Map中,
并覆盖getParameter()方法与getAttribute()方法。