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

来源:互联网 发布:淘宝店的信誉等级 编辑:程序博客网 时间:2024/06/13 03:15

     过滤器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 stubSystem.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 stubSystem.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 stubSystem.out.println("filterThree---"+"error处理"+new Date());//arg2.doFilter(arg0, arg1);}



REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。


0 0
原创粉丝点击