</pre><p></p><p></p><pre code_snippet_id="1932564" snippet_file_name="blog_20161017_1_8763027" name="code" class="java">package com.xxx.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
/**
* FIlter
*
* 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest,也可以修改HttpServletRequest头和数据
* 在HttpServletResponse到达客户端之前,拦截HttpServletResponse,也可以修改HttpServletResponse的头和数据
*
* FIlter的应用:
* 检查用户请求的权限
* 日志,记录用户请求记录
* 负责解码的Filter 对飞标准的编码对的请求解码
* 能改变XML内容的XSLT Filter等
* 提取servlet相同的部分用filter处理,例如处理编码问题
*
* 创建Filter:
* 1、创建Filter处理类
* 2、在web.xml文件配置filter或使用注解<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
*/
@WebFilter(filterName="log",urlPatterns="/*")
public class LogFilter implements Filter {
//filter配置信息
private FilterConfig config;
//Filter的初始化
@Override
public void init(FilterConfig config) throws ServletException {
this.config=config;
}
//用于Filter销毁前完成某些资源的回收
@Override
public void destroy() {
this.config=null;
}
//实现过滤
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//获取ServletContext对象,用于记录日志
ServletContext context=this.config.getServletContext();
//开始过滤
System.out.println("开始过滤");
//将请求转换成HttpServletRequest请求
HttpServletRequest hrequest=(HttpServletRequest) request;
//输出提示信息
System.out.println("Filter已经拦截到用户的请求地址"+hrequest.getServletPath());
//链式处理,放行到目的地址
chain.doFilter(request, response);
System.out.println("过滤结束");
System.out.println("请求被定为到"+hrequest.getRequestURI());
}
}
配置web.xml文件
<filter>
<filter-name>log</filter-name>
<filter-class>com.xxx.filter.LogFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>log</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
控制台输出
开始过滤
Filter已经拦截到用户的请求地址/testServlet
过滤结束
请求被定为到/test/testServlet
@WebFilter支持的常用属性
asyncSupported 不是必须 指定Filter是否支持异步操作模式。
dispatcherTypes 不是必须 指定该filter仅对那种dispatcher模式的请求进行过滤,该属性支持 ASYNC,ERROR,FORWARD ,INCLUDE,REQUEST这5个值得任意组合。默认值为同时过滤5中模式的请求
displayName 不是必须 指定Filter的显示名
filterName 必须 指定filter的名称
initParams 不是必须 用于为该filter配置参数
servletNames 不是必须 该属性值可以指定多个servlet的名称,用于指定该filter仅多着几个servlet执行过滤
urlPatterns/value 不是必须 这两个属性的作用完全相同,都指定该filter所拦截的URL