SpringMVC-快速入门(6.4)- SpringMVC的拦截器(Interceptor)和过滤器(Filter)应用

概述

本章将近一步介绍SpringMVC的拦截器(Interceptor)和过滤器(Filter)的应用场景。因个人时间有限,先贴个引用文章
基于SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系

过滤器(Filter)和拦截器(Interceptor)之间的最大区别就是,过滤器可以包装 Request 和 Response,而拦截器并不能。

多个过滤器与拦截器的代码执行顺序

1.1、定义两个过滤器

public class TestFilter1 extends OncePerRequestFilter {

	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
		//在DispatcherServlet之前执行
		System.out.println("############TestFilter1 doFilterInternal executed############");
	    
		filterChain.doFilter(request, response);
		
		//在视图页面返回给客户端之前执行,但是执行顺序在Interceptor之后
		System.out.println("############TestFilter1 doFilter after############");
}

public class TestFilter2 extends OncePerRequestFilter {

	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
		System.out.println("############TestFilter2 doFilterInternal executed############");
		filterChain.doFilter(request, response);
		System.out.println("############TestFilter2 doFilter after############");
	}
}

1.2、web.xml中注册这两个过滤器

<!-- 自定义过滤器:testFilter1 -->	
 	<filter>
		<filter-name>testFilter1</filter-name>
		<filter-class>cn.zifangsky.filter.TestFilter1</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>testFilter1</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- 自定义过滤器:testFilter2 -->	
 	<filter>
		<filter-name>testFilter2</filter-name>
		<filter-class>cn.zifangsky.filter.TestFilter2</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>testFilter2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

2.1、定义两个拦截器

public class BaseInterceptor implements HandlerInterceptor{
	
	/**
	 * 在DispatcherServlet之前执行
	 * */
	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
		System.out.println("************BaseInterceptor preHandle executed**********");
		return true;
	}

	/**
	 * 在controller执行之后的DispatcherServlet之后执行
	 * */
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		System.out.println("************BaseInterceptor postHandle executed**********");
	}
	
	/**
	 * 在页面渲染完成返回给客户端之前执行
	 * */
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("************BaseInterceptor afterCompletion executed**********");
	}
}

public class TestInterceptor implements HandlerInterceptor {

	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
		System.out.println("************TestInterceptor preHandle executed**********");
		return true;
	}

	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		System.out.println("************TestInterceptor postHandle executed**********");
	}

	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("************TestInterceptor afterCompletion executed**********");
	}
}

2.2、springmvc-servlet.xml中注册这两个拦截器

    <!-- 拦截器 -->
 	<mvc:interceptors>
		<!-- 对所有请求都拦截,公共拦截器可以有多个 -->
		<bean name="baseInterceptor" class="com.ymqx.interceptor.BaseInterceptor" />
		
		<mvc:interceptor>		
			<!-- 对/test.html进行拦截 -->
			<mvc:mapping path="/test.html"/>
			<!-- 特定请求的拦截器只能有一个 -->
			<bean class="com.ymqx.interceptor.TestInterceptor" />
		</mvc:interceptor>
	</mvc:interceptors>

3、新增一个测试使用的Controller

@Controller
@RequestMapping("/interceptor")
public class InterceptorController {
    @RequestMapping("/action1")
    public void action1(@RequestBody Product product){
        System.out.println("Product:" + product);
    }
}

运行结果:

  1. 过滤器的运行是依赖于servlet容器的,跟springmvc等框架并没有关系。
  2. 多个过滤器的执行顺序跟web.xml文件中定义的先后关系有关。
  3. 多个拦截器的执行顺序跟在SpringMVC的配置文件中定义的先后顺序有关。
  4. 先执行过滤器,再执行拦截器,且均遵循“先进后出”。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值