过滤器Filter主要分四大类,Request,INCLUDE,FORWARD,ERROR,可以通过FILTER中Dispather标签进行设置,Dispather拦截所有的web中请求调用方式,默认是REQUEST方式。下面我们看看各种方式的用法
1.REQUEST
这是默认的处理方式,假设我们访问任何页面都跳转到login页面,我们可以通过如下设置
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("filterThree---"+"doFilter开始处理"+new Date());
//arg2.doFilter(arg0, arg1);
HttpServletResponse response=(HttpServletResponse)arg1;
HttpServletRequest request=(HttpServletRequest)arg0;
response.sendRedirect(request.getContextPath()+"/Home/login");
System.out.println("filterThree---"+"doFilter处理完成"+new Date());
}
上面的代码会造成死循环,因为我们访问任何页面都跳转到login页面,我们跳转到login页面处理请求时候,也会跳转到login页面,反复跳转,造成死循环。
但是,我们换一种方式,就不会出现如下问题,使用forward跳转,因为默认情况下,Request设置对forward跳转不进行拦截
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("filterThree---"+"doFilter开始处理"+new Date());
//arg2.doFilter(arg0, arg1);
HttpServletResponse response=(HttpServletResponse)arg1;
HttpServletRequest request=(HttpServletRequest)arg0;
//response.sendRedirect(request.getContextPath()+"/Home/login");
request.getRequestDispatcher("/Home/login").forward(arg0, arg1);
System.out.println("filterThree---"+"doFilter处理完成"+new Date());
}
2.FORWARD
FORWARD只对通过request.getRequestDispatcher进行forward转发的请求进行处理,
可以在web.xml进行设置
<filter>
<filter-name>threefilter</filter-name>
<filter-class>com.filter.filterThree</filter-class>
</filter>
<filter-mapping>
<filter-name>threefilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
3.INCLUDE
INCLUDE只对通过request.getRequestDispatcher进行INCLUDE的请求进行过滤
4.ERROR
如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用,也就是假设我们访问一个不存在的页面的地址时候,就会调用异常处理
<error-page>
<error-code>404</error-code>
<location>/Home/error</location>
</error-page>
<filter>
<filter-name>threefilter</filter-name>
<filter-class>com.filter.filterThree</filter-class>
</filter>
<filter-mapping>
<filter-name>threefilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("filterThree---"+"error处理"+new Date());
//arg2.doFilter(arg0, arg1);
}
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。