这里是一个日志Filter,这个Filter负责拦截所有的用户请求,并将请求的信息记录在日志中。源码如下:
@WebFilter(filterName="log" ,urlPatterns={"/*})
public class LogFilter implements Filter
{
//FilterConfig可用于访问Filter的配置信息
private FilterConfig config;
//实现初始化
public void init(FilterConfig config)
{
this.config = config;
}
//实现销毁方法
public void destroy()
{
this.config = null;
}
//执行过滤的核心方法
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException
{
//下面代码用于对用户请求执行预处理
//获取servletContext对象,用于记录日志
ServletContext context = this.config.getServletContext();
long before = System.currentTimeMillis();
System.out.println("开始过滤......");
//将请求转换成HttpServletRequest请求
HttpServletRequest hrequest = (HttpServletRequest)request;
//输出提示信息
System.out.println("Filter已经截获到用户的请求的地址:"+hrequest.getServletPath());
//Fileter只是链式处理,请求依然放行到目的地址
chain.doFilter(request,response);
//下面的代码用于对服务器响应执行后处理
long after = System.currentTimeMillis();
//输出提示信息
System.out.println("过滤结束");
//输出提示信息
System.out.println("请求被定位到"+hrequest.getRequestURL() + "所话的事件为:"+(after - before));
}
}
doFilter()方法可以实现对用户请求进行预处理,也可以实现对服务器-响应进行后处理,分界线为是否调用chain.doFilter(),执行该方法前,对用户请求进行预处理,执行后对服务器进行后处理。 在上面的请求Filter中,仅在日志记录请求的URL,对所有的请求都执行chain.doFilter(request,response)方法,当Filter对请求过滤后,依然将请求发送到目的地址。如果需要检查权限,可以在Filter中根据用户请求的HTTPSession,判断用户权限是否足够。如果权限不够,直接调用重定向即可,无须调用chain.doFilter(request,response)方法。
Filter概述
Filter是javax.servlet包中的一个接口,一个filter是对客户请求/响应进行拦截任务的一个对象。Filter调用doFilter()方法,传送给该方法的FilterConfig ,包含其初始化参数。
Filter的工作流程:
当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。同样在这个过程中,用户可以修改响应信息,从而完成一定的任务。
多个过滤器同时过滤一个请求时,组成过滤链FilterChain,服务器按web.xml中定义过滤器先后顺序组成一条链,然后执行doFilter()方法。
执行流程:
执行第一个过滤器的chain.doFilter()之前的代码——>第二个过滤器的chain.doFilter()之前的代码——>…….——>第n个过滤器的chain.doFilter()之前的代码——>所请求Servlet的service()方法中的代码——>所请求的doGet()或doPost()方法中的代码——>第n个过滤器的chain.doFilter()之后的代码——>……——>第二个过滤器的chain.doFilter()之后的代码——>第一个过滤器的chain.doFilter()之后的代码。
参照于文章:https://blog.csdn.net/csdnyoyo/article/details/51194246