1.添加文件
继续在《 Spring学习笔记<三> 获取请求对象和请求头》的项目基础上再添加三个文件:
test_Interceptor.jsp文件(WebContent文件夹下面)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>helloWorld</title>
</head>
<body>
<a href="testInterceptor">testInterceptor</a>
<br/><br/>
<a href="testSecondInterceptor">testSecondInterceptor</a>
<br/><br/>
</body>
</html>
InterceptorTest.java文件(com.shi.springmvc.interceptors包下面)
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class InterceptorTest {
private String SUCCESS = "success";
@RequestMapping(value = "/testInterceptor")
public String testInterceptor() {
System.out.println("testInterceptor被执行");
return SUCCESS;
}
@RequestMapping(value = "/testSecondInterceptor")
public String testSecondInterceptor() {
System.out.println("testSecondInterceptor被执行");
return SUCCESS;
}
}
还有两个实现了HandlerInterceptor接口的拦截器对象,在实现的三个方法中分别打印当前方法被执行了,以方便我们查看这些方法是否执行以及执行的顺序。
FirstInterceptor.java对象文件(com.shi.springmvc.interceptors包下面)
public class FirstInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("FirstInterceptor:afterCompletion被执行");
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("FirstInterceptor:postHandle被执行");
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("FirstInterceptor:preHandle被执行");
return true;
}
}
SecondInterceptor.java对象文件(com.shi.springmvc.interceptors包下面)
public class SecondInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("SecondInterceptor:afterCompletion被执行");
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("SecondInterceptor:postHandle被执行");
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("SecondInterceptor:preHandle被执行");
return true;
}
}
2. HandlerInterceptor接口
Spring MVC中对于一个请求可以添加多个拦截器,而这个拦截器集合中会链式调用这些拦截器。每个拦截器会执行固定顺序的方法,而这些方法就定义在HandlerInterceptor类中。这是拦截器的一个基础接口,里面有三个方法,分别是:
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
使用时机:在处理请求之前
应用场景:可以在该方法中放入一些初始化的操作,比如权限验证,日志管理等
注意:该方法的返回值是boolean类型,若返回值为true,则继续调用后面的拦截器和目标方法,若返回为false,则不会调用后面的拦截器和目标方法,表示请求结束
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception;
使用时机:在调用目标方法之后,渲染视图之前被调用。具体来说,是在调用了Controller中定义的方法之后,但在DispatcherServlet 处理视图返回渲染结果之前被调用。
应用场景:根据使用的时机就可以知道,该方法可以对Controller处理之后ModelAndView进行操作
注意:当有多个interceptor的时候,对于preHandler的调用顺序和postHandler的调用顺序是恰恰想法的。
举例来说,现在有一个FirstInterceptor和一个SecondInterceptor,单独调用FirstInterceptor的三个方法的顺序为:
FirstInterceptor.preHandle->HandlerAdapter.handle->FirstInterceptor.postHanle->DispatcherServlet.render->FirstInterceptor.afterCompletion。
对于两个interceptor的调用顺序大致如下:
可以总结出preHandler是先进先执行,而postHandler是先进后执行
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception;
使用时机:渲染视图之后
应用场景:释放资源
3.然后在springmvc.xml文件中添加:
<mvc:interceptors>
<bean class="com.shi.springmvc.interceptors.FirstInterceptor"></bean>
<mvc:interceptor>
<!-- 特定请求拦截器,只拦截path=testSecondInterceptor的请求 -->
<mvc:mapping path="/testSecondInterceptor" />
<bean class="com.shi.springmvc.interceptors.SecondInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
我们在配置文件配置拦截器FirstInterceptor和SecondInterceptor,并指定SecondInterceptor只对path=”/testSecondInterceptor”的请求进行拦截。
好了,看一下效果图:
最后附上demo下载地址:戳我进入

本文详细介绍如何在SpringMVC项目中使用拦截器,并通过实例演示了多个拦截器的配置及执行顺序。包括自定义拦截器类、控制器方法以及springmvc.xml配置文件的具体设置。
8137

被折叠的 条评论
为什么被折叠?



