您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
04-SpringMVC拦截器-快速入门详解(多拦截器与先进后出顺序)
发布时间:2025-01-11 13:41:15编辑:雪饮阅读()
-
继上篇了解了Spring MVC拦截器的preHandle方法,那么我们可以做这样的改变
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
/*
* 这里返回值若是false,则接下来的流程不会继续执行,例如目标方法里面有返回ModelAndView,则页面看不到视图的
* */
System.out.println("MyInterceptor1的preHandle被执行");
String param=request.getParameter("param");
if("yes".equals(param)){
return true;
}
request.getRequestDispatcher("/error.jsp").forward(request,response);
return false;
}
然后在webapp根目录建立error.jsp如
<%--
Created by IntelliJ IDEA.
User: 1
Date: 2025/1/11
Time: 13:20
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
error
</body>
</html>
那么如果我访问的路径如
http://localhost:8080/SpringProject2Module1_war/target
没有传递
param=yes
的时候
将会返回error于浏览器中。
像是这样的路径
http://localhost:8080/SpringProject2Module1_war/target?param=yes
才会到达上篇中提到的target方法里面的正常视图返回。
同样,对于拦截器的postHandle方法我们也可以修改如:
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
modelAndView.addObject("name","kasumi");
System.out.println("MyInterceptor1的postHandle被执行");
}
这样以来即便访问如
http://localhost:8080/SpringProject2Module1_war/target?param=yes
那么其原来输出的name的值会被kasumi所替代。
那么拦截器还可以多个。
再新增一个拦截器
package sp21.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor2 implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor2的preHandle被执行");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor2的postHandle被执行");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor2的afterCompletion被执行");
}
}
然后修改Spring MVC配置文件增加这第二个拦截器
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--对哪些自由执行拦截操作,这里配置为/**表示对所有方法都执行-->
<mvc:mapping path="/**"/>
<bean class="sp21.interceptor.MyInterceptor1"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="sp21.interceptor.MyInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
请求路径如
http://localhost:8080/SpringProject2Module1_war/target?param=yes
根据我们手动输出的日志来看,拦截器也是遵循先进后出的原则
MyInterceptor1的preHandle被执行
MyInterceptor2的preHandle被执行
执行了TargetController的target
MyInterceptor2的postHandle被执行
MyInterceptor1的postHandle被执行
MyInterceptor2的afterCompletion被执行
MyInterceptor1的afterCompletion被执行
而整体的先进的情况取决于你在Spring MVC配置文件中配置的interceptor的顺序。如你将上面的配置拦截器配置修改如:
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="sp21.interceptor.MyInterceptor2"/>
</mvc:interceptor>
<mvc:interceptor>
<!--对哪些自由执行拦截操作,这里配置为/**表示对所有方法都执行-->
<mvc:mapping path="/**"/>
<bean class="sp21.interceptor.MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
则上述访问就会在控制台出现的手动输出的日志如:
MyInterceptor2的preHandle被执行
MyInterceptor1的preHandle被执行
执行了TargetController的target
MyInterceptor1的postHandle被执行
MyInterceptor2的postHandle被执行
MyInterceptor1的afterCompletion被执行
MyInterceptor2的afterCompletion被执行
关键字词:SpringMVC,拦截器,顺序
相关文章
- 03-SpringMVC拦截器-快速入门(解决System.out.println
- 27-SpringMVC的请求-文件上传-多文件上传的代码实现
- 26-SpringMVC的请求-文件上传-单文件上传的代码实现2
- 25-SpringMVC的请求-文件上传-单文件上传的代码实现1(
- 24-SpringMVC的请求-文件上传-客户端表单实现
- 23-SpringMVC的请求-获得请求参数-获得请求头信息(获
- 22-SpringMVC的请求-获得请求参数-获得Servlet相关API
- 21-SpringMVC的请求-获得请求参数-自定义类型转换器(
- 20-SpringMVC的请求-获得请求参数-Restful风格的参数
- 19-SpringMVC的请求-获得请求参数-参数绑定注解@Reque