SpringMVC的拦截器

1. 自定义拦截器

创建一个FirstInterceptor.java

package com.springmvc.interceptors;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class FirstInterceptor implements HandlerInterceptor{

	/**
	 * 该方法在目标方法之前被调用.
	 * 若返回值为 true, 则继续调用后续的拦截器和目标方法. 
	 * 若返回值为 false, 则不会再调用后续的拦截器和目标方法. 
	 * 
	 * 可以考虑做权限. 日志, 事务等. 
	 */
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		System.out.println("[FirstInterceptor] preHandle");
		return true;
	}

	/**
	 * 调用目标方法之后, 但渲染视图之前. 
	 * 可以对请求域中的属性或视图做出修改. 
	 */
	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("[FirstInterceptor] postHandle");
	}

	/**
	 * 渲染视图之后被调用. 释放资源
	 */
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("[FirstInterceptor] afterCompletion");
	}

}

在SpringMVC配置文件中配置自定义拦截器

<mvc:interceptors>
	<!-- 配置自定义的拦截器 -->
	<bean class="com.springmvc.interceptors.FirstInterceptor"></bean>
</mvc:interceptors>

发起请求时,如发起emps请求,拦截器就起作用了,效果如下:
在这里插入图片描述
拦截器方法执行顺序

在这里插入图片描述

2. 拦截器的配置

这里要介绍一个SpringMVC配置文件的标签<mvc:interceptor></mvc:interceptor>,这个标签是包含在<mvc:interceptors></mvc:interceptors>里面的,其子标签可以定义此拦截器作用于哪些路径,不作用于哪些路径

创建一个SecondInterceptor.java

package com.springmvc.interceptors;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class SecondInterceptor implements HandlerInterceptor{

	/**
	 * 该方法在目标方法之前被调用.
	 * 若返回值为 true, 则继续调用后续的拦截器和目标方法. 
	 * 若返回值为 false, 则不会再调用后续的拦截器和目标方法. 
	 * 
	 * 可以考虑做权限. 日志, 事务等. 
	 */
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		System.out.println("[SecondInterceptor] preHandle");
		return false;
	}

	/**
	 * 调用目标方法之后, 但渲染视图之前. 
	 * 可以对请求域中的属性或视图做出修改. 
	 */
	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("[SecondInterceptor] postHandle");
	}

	/**
	 * 渲染视图之后被调用. 释放资源
	 */
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("[SecondInterceptor] afterCompletion");
	}

}

SpringMVC中配置

<mvc:interceptors>
	<!-- 配置拦截器(不)作用的路径 -->
	<mvc:interceptor>
		<!-- 只作用于emps请求 -->
		<mvc:mapping path="/emps"/>
		<bean class="com.springmvc.interceptors.SecondInterceptor"></bean>
	</mvc:interceptor>
</mvc:interceptors>

发起emps请求,可以看到两个拦截器都起作用了
在这里插入图片描述
发器其他请求,如下,SecondInterceptor拦截器没有起作用
在这里插入图片描述

3. 拦截器的执行顺序

在这里插入图片描述
从这个途中可以看出,当配置多个个拦截器起作用时,执行顺序有点乱

两个拦截器在SpringMVC的配置顺序如下:

<mvc:interceptors>
	<!-- 配置自定义的拦截器 -->
	<bean class="com.springmvc.interceptors.FirstInterceptor"></bean>
		
	<!-- 配置拦截器(不)作用的路径 -->
	<mvc:interceptor>
		<mvc:mapping path="/emps"/>
		<bean class="com.springmvc.interceptors.SecondInterceptor"></bean>
	</mvc:interceptor>
</mvc:interceptors>

结论:
在这里插入图片描述

  • 对于preHandle按配置的顺序执行
  • 对于postHandle按配置的反顺序执行
  • 对于afterCompletion按配置的反顺序执行

图释:
在这里插入图片描述
将SecondInterceptor的preHandle方法返回值改为false时,则不会再调用后续的拦截器和目标方法,上面方法有注释解释。

@Override
public boolean preHandle(HttpServletRequest request,
		HttpServletResponse response, Object handler) throws Exception {
	System.out.println("[SecondInterceptor] preHandle");
	return false;//==================================================
}

结果:
在这里插入图片描述
图释:

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值