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

标签:Spring,mvc, ,
0
投稿

猜你喜欢

  • C#中字符串的一般性和特殊性

    2023-03-23 19:06:07
  • Java根据ip地址获取归属地实例详解

    2023-11-25 06:24:38
  • Android EditText追加空格、限制字符等方法示例

    2023-10-02 17:10:47
  • Android自定义ImageView实现自动放大缩小动画

    2021-11-07 12:24:48
  • OpenCV + MFC实现简单人脸识别

    2023-02-24 06:15:55
  • 使用JMX监控Zookeeper状态Java API

    2023-05-14 02:27:26
  • JavaWeb之Filter过滤器详解

    2021-06-30 03:40:55
  • C# 实现颜色的梯度渐变案例

    2023-11-20 22:01:06
  • Spring+Vue整合UEditor富文本实现图片附件上传的方法

    2022-09-27 10:36:13
  • Java语言中的内存泄露代码详解

    2023-08-26 22:51:06
  • 解析Android横竖屏切换的问题

    2021-07-20 11:37:58
  • C#验证给定字符串是否为数字的方法

    2021-08-24 10:22:21
  • SpringBoot可视化监控的具体应用

    2023-07-28 20:32:02
  • WPF实现手风琴式轮播图切换效果

    2022-01-24 13:49:26
  • spring cloud gateway如何获取请求的真实地址

    2023-11-28 20:20:12
  • C#生成漂亮验证码完整代码类

    2022-06-17 14:03:33
  • Java System类两个常用方法代码实例

    2023-02-01 13:52:15
  • Android自定义控件实现滑动开关效果

    2022-10-25 00:45:39
  • 详解如何在Flutter中使用媒体播放器

    2021-06-26 01:40:43
  • C语言实现两个矩阵相乘

    2023-07-22 12:41:20
  • asp之家 软件编程 m.aspxhome.com