2.9 Filter介绍 2.9.1 创建Filter类
2.9 Filter介绍
Filter
可认为是Servlet
的一种“加强版”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse
进行后处理,是个典型的处理链。Filter
也可对用户请求生成响应,这一点与Servlet
相同,但实际上很少会使用Filter
向用户请求生成响应。
使用Filter的流程
使用Filter
完整的流程是:
Filter
对用户请求进行预处理,- 接着将请求交给
Servlet
进行处理并生成响应, - 最后
Filter
再对服务器响应进行后处理。
Filter用途
Filter
有如下几个用处:
- 在
HttpServletRequest
到达Servlet
之前,拦截客户的HttpservletRequest
- 根据需要检查
HttpservletRequest
,也可以修改HttpServletRequest
头和数据。 - 在
HttpservletResponse
到达客户端之前,拦截HttpServletResponse
- 根据需要检查
HttpServletResponse
,也可以修改HttpServletResponse
头和数据
Filter
有如下几个种类。
- 用户授权的
Filter
:Filter
负责检查用户请求,根据请求过滤用户非法请求。 - 日志
Filter
:详细记录某些特殊的用户请求 - 负责解码的
Filter
:包括对非标准编码的请求解码。 - 能改变
XML
内容的XSLTFilter
等。 Filter
可负责拦截多个请求或响应:一个请求或响应也可被多个Filter
拦截。
创建Filter步骤
创建一个Filter
只需两个步骤
- 创建
Filter
处理类。 - 在
web.Xml
文件中配置Filter
或用注解配置Filter
2.9.1 创建Filter类
Filter接口方法
创建Filter
必须实现javax.servlet.Filter
接口,在该接口中定义了如下三个方法:
void init(FilterConfig config)
:用于完成Filter
的初始化。void destroy()
:用于Filter
销毁前,完成某些资源的回收。void dofilter(ServletRequest request, ServletResponse response, FilterChain chain)
:实现过滤功能,该方法就是对每个请求及响应增加的额外处理。
LogFilter.java
下面介绍一个日志Filter
,这个Filter
负责拦截所有的用户请求,并将请求的信息记录在日志中
1 | package lee; |
上面的程序中实现了doFilter
方法,实现doFilter
方法就可实现对用户请求进行预处理,也可实现对服务器响应进行后处理。
预处理和后处理的分界线为是否调用了chain.doFilte(r)
,执行该方法之前,即对用户请求进行预处理;执行该方法之后,即对服务器响应进行后处理.
在上面的请求Filter
中,仅在日志中记录请求的URL
,对所有的请求都执行chain do Filter( request, reponse)
方法,当Filter
对请求过滤后,依然将请求发送到目的地址。
使用Filter进行权限检查
如果需要检查权限,可以在Filter
中根据用户请求的Httpsession
,判断用户权限是否足够。如果权限不够,直接调用重定向即可,无须调用chain.doFilter(request,reponse)
方法。