Springmvc * 执行顺序及各方法作用详解
作者:开拖拉机的蜡笔小新 发布时间:2023-06-10 08:11:46
实现HandlerInterceptor接口或者继承HandlerInterceptor的子类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter ,下面讲实现其接口的写法,先看一下这个接口的三个方法.
- 方法preHandle: 顾名思义,该方法将在请求处理之前进行调用,在controller之前执行。SpringMVC 中的Interceptor 是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor 。每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,比如说获取cookie的值或者判断是否已经登录,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean 类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法。
- 方法postHandle:由preHandle 方法的解释我们知道这个方法包括后面要说到的afterCompletion 方法都只能是在当前所属的Interceptor 的preHandle 方法的返回值为true 时才能被调用。postHandle 方法,顾名思义就是在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作,比如说设置cookie,返回给前端。postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行
- 方法afterCompletion:该方法也是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。
例:
@Component
public class AuthInterceptor implements HandlerInterceptor {
private static final String TOKEN_COOKIE = "token";
@Autowired
private UserDao userDao;
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler)
throws Exception {
Map<String, String[]> map = req.getParameterMap();
map.forEach((k,v) ->req.setAttribute(k, Joiner.on(",").join(v)));
String requestURI = req.getRequestURI();
if (requestURI.startsWith("/static") || requestURI.startsWith("/error")) {
return true;
}
Cookie cookie = WebUtils.getCookie(req, TOKEN_COOKIE);
if (cookie != null && StringUtils.isNoneBlank(cookie.getValue())) {
User user = userDao.getUserByToken(cookie.getValue());
if (user != null) {
req.setAttribute(CommonConstants.LOGIN_USER_ATTRIBUTE, user);
UserContext.setUser(user);
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest req, HttpServletResponse res, Object handler,
ModelAndView modelAndView) throws Exception {
String requestURI = req.getRequestURI();
if (requestURI.startsWith("/static") || requestURI.startsWith("/error")) {
return ;
}
User user = UserContext.getUser();
if (user != null && StringUtils.isNoneBlank(user.getToken())) {
String token = requestURI.startsWith("logout")? "" : user.getToken();
Cookie cookie = new Cookie(TOKEN_COOKIE, token);
cookie.setPath("/");
cookie.setHttpOnly(false);
res.addCookie(cookie);
}
}
@Override
public void afterCompletion(HttpServletRequest req, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
UserContext.remove();
}
}
总结
以上所述是小编给大家介绍的Springmvc * 执行顺序及各方法作用详解网站的支持!
来源:https://www.cnblogs.com/xiangkejin/archive/2018/07/25/9368984.html


猜你喜欢
- 问题学习完maven后,用maven创建了一个web项目,然后在这个web项目中创建了一个java文件夹并标记这个目录为源码根目录,当我准备
- 使用Spring data JPA开发已经有一段时间了,这期间学习了一些东西,也遇到了一些问题,在这里和大家分享一下。前言:Spring d
- 如果对共享的可变数据的访问不能同步,其后果非常可怕,即使这个变量是原子可读写的。下面考虑一个线程同步方面的问题。对于线程同步,Java类库提
- 这篇文章主要介绍了SpringMVC Mybatis配置多个数据源并切换代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一
- 本文实例讲述了C#编程实现四舍五入、向上及下取整的方法。分享给大家供大家参考,具体如下:在处理一些数据时,我们希望能用“四舍五入”法实现,但
- AOP概念的引入传统的登录原理:如上图所示这是一个基本的登录原理图,但是如果我们想要在这个登录之上添加一些新的功能,比如权限校验那么我们能想
- 这篇文章主要介绍了Spring JDK * 实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 茫茫人海千千万万,感谢这一秒你看到这里。希望我的能对你的有所帮助!共勉!愿你在未来的日子,保持热爱,奔赴山海!Java基础知识(多态)多态因
- 本文实例讲述了Spring实战之@Autowire注解用法。分享给大家供大家参考,具体如下:一 配置<?xml version=&qu
- 本文实例讲述了C#自定义签名章实现方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Coll
- 创建started service 应用组件(例如Activity)
- 本文所要介绍的简易天气App主要用RxAndroid、MVP、Retrofit实现,首先来看看效果:主页内容:右侧栏天气列表:左侧栏城市列表
- 前言开发项目中需要进行单文件多文件的上传功能,下面演示的ApiResponse是自己分装的返回值,要根据自己的项目来完成。使用的mvvm框架
- 这篇博客将梳理一下.NET中4个Timer类,及其用法。1. System.Threading.Timerpublic Timer(Time
- C#函数式程序设计之作用域在C#中,变量的作用域是严格确定的。其本质是所有代码生存在类的方法中、所有变量只生存于声明它们的模块中或者之后的代
- 什么是WebSocket WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间
- 前言Lifecycle是Jetpack架构组件中用来感知生命周期的组件,使用Lifecycles可以帮助我们写出和生命周期相关更简洁更易维护
- 前言反射和注解在java中偏高级用法,一般在各种框架中被广泛应用,文章简单介绍下反射和注解的用法,希望对你的工作学习有一定帮助java注解什
- 1.JavaBean转Map1.1.简介这篇博客是通过反射来进行实现转换的在学习redis中,发现了一个知识点,就是Java对象转map,视
- 什么是fescar?关于fescar的详细介绍,请参阅fescar wiki。传统的2PC提交协议,会持有一个全局性的锁,所有局部事务预提交