(七)SpringMVC拦截器
程序员文章站
2022-07-09 18:05:06
...
SpringMVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理,我们可以自定义一些拦截器来实现特定的功能,两者之间的区别在于:
- 过滤器是 Servlet 规范中的一部分,适用于任何 Java Web 工程;拦截器只适用于 SpringMVC框架。
- 过滤器可以对配置的 url 路径下的所有要访问的资源进行拦截;拦截器只会拦截配置的 url 路径下访问的控制器方法,即不会对要访问的 jsp、html、css 等资源进行拦截。
1、拦截器的定义与配置
1.1 自定义拦截器:
在 Springmvc 中,自定义拦截器要实现 HandlerInterceptor 接口,因为 Java 1.8 版本的原因,接口已经提供了默认实现,所以我们只需重写用到的方法即可。
public class MyInterceptor implements HandlerInterceptor {
/**
* @return true,则往下执行;false,则进行拦截,不再往下执行。
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("...preHandle, 预处理...");
// 此处可做页面跳转,例如,未登录时跳转到登录界面
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("...postHandle, 后处理...");
// 此处可做页面跳转,例如,将公用的模型数据(比如菜单导航之类的)传到视图
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("...afterCompletion, 最终处理...");
}
}
- preHandle() :在进入Handler方法之前执行(控制器方法执行前),进行预处理,可以用于身份认证、身份授权。
- postHandle() :进入Handler方法之后(控制器方法执行后),返回ModelAndView之前执行,可以看到该方法中有个 ModelAndView 的形参。
- afterCompletion() :执行Handler方法完成之后执行,可以用于释放资源、统一异常处理,统一日志处理等。
注意,在 preHandle() 和 postHandle() 中,都可以指定响应的界面,从而改变控制器方法返回的页面。
1.2 拦截器配置:
Springmvc 中的拦截器是针对具体的映射器的,Springmvc 框架将配置的类似全局的拦截器注入到每个HandlerMapping中。
- springmvc.xml
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置拦截路径 -->
<mvc:mapping path="test/*"/>
<!-- 配置拦截器对象 -->
<bean class="com.lyj.Interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
2、运行测试
- 控制器方法:
@RequestMapping("interceptor")
public String testInterceptor() throws Exception{
System.out.println("...testInterceptor...");
return "success";
}
- index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="test/interceptor">测试拦截器</a>
</body>
</html>
- success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>结果页面</title>
</head>
<body>
<h3>运行成功</h3>
<% System.out.println("success.jsp 页面执行"); %>
</body>
</html>
-
运行结果:
-
控制台输出:
3、多个拦截器
当我们为某个路径配置了多个拦截器时, Springmvc 框架会根据拦截器的配置顺序来分别执行这些拦截器,如图:
- 配置多个拦截器:
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置拦截路径 -->
<mvc:mapping path="/test/*"/>
<!-- 配置拦截器对象 -->
<bean class="com.lyj.Interceptor.MyInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<!-- 配置拦截路径 -->
<mvc:mapping path="/test/*"/>
<!-- 配置拦截器对象 -->
<bean class="com.lyj.Interceptor.MyInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
- 执行顺序:
参考链接:
下一篇: HDFS的安全模式