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

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


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值