过滤器的作用
过滤器能够动态的访问和拦截请求头和响应头,我们可以进行检查和修改。
- 过滤器本身并不生成请求和响应对象,只是提供过滤功能。
- 过滤器能够在Servlet被调用之前检查Request对象,并修Request Header和Request内容。
- 在Servlet被调用之后检查Response对象,修改Response Header和Response的内容。
- Servlet过滤器可以过滤的Web组件包括Servlet,JSP和HTML等文件。Filter类似于IO中的过滤流,实现也类似于Servlet。
过滤器生命周期
所有的Servlet过滤器都必须实现javax.servlet.Filter
接口,并实现该接口中的三个方法:
init(FilterConfig filterConfig)
Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用该方法。该方法将读取web.xml
文件中Servlet过滤器的初始化参数。
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter
方法。FilterChain用户访问后续过滤器。这里的ServletRequest
和ServletResponse
一般需要转换成具体的Servlet实现对于的对象,如:HttpServletRequest
和HttpServletResponse
。
destroy()
Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。
Filter的配置
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.runoob.test.LogFilter</filter-class>
<init-param>
<param-name>name</param-name>
<param-value>lange</param-value>
</init-param>
</filter>
Filter的执行顺序
Filter的执行顺序与在web.xml配置文件中的配置顺序一致,一般把Filter配置在所有的Servlet之前。
Filter使用实例
- 评论的筛选
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
//获取评论并屏蔽关键字
String comment = req.getParameter("comment");
comment = comment.replace("Fuck", "***");
//重新设置参数
req.setAttribute("comment", comment);
//继续执行
chain.doFilter(request, response);
}