您的位置:首页 > 编程语言 > Java开发

Spring Mvc那点事---(20)Spring Mvc过滤器Filter分类

2016-07-03 16:29 405 查看
     过滤器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:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  filter Spring Mvc mvc