肝了十天半月,献上纯手绘“Spring/Cloud/Boot/MVC”百口桶脑图
二本渣渣被炒,18天脱产学飞SpringBoot,逆袭腾讯涨薪18K!
HandlerInterceptor 详解
HandlerInterceptor 容许定制 handler 处置器实行链的事情流接口。ag九游会可以自界说阻拦器用于阻拦 handlers 处置器(你可以了解为 controller 层的接口),从而可以添加一些配合的反复性的处置举动(比方接口鉴权,接口日记记载,功能监控等),而不必修正每一个 handler 的完成。
留意,此基于 SpringBoot 2.3.12.RELEASE 版本解说。
HandlerInterceptor 接口只要三个默许空完成办法,在低版本中这三个办法不是默许办法,而是笼统办法。
public interface HandlerInterceptor {default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true;}default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {}default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {}}
这三个办法的实行次序图如下:
preHandle
preHandle 前置处置,阻拦一个处置器(handler)的实行,preHandle 办法会在 HandlerMapping 确定一个得当的处置器工具之后,但在 HandlerAdapter 挪用处置器之前被挪用。可以复杂了解为 controller 接口被挪用之前实行。
Intercepter 是链式的,便是一个接着一个实行。假如此办法前往 true,则会实行下一个阻拦器大概间接实行处置器。假如此办法前往 false 大概抛出非常则停止实行链,也不再挪用处置器。
留意,此办法假如不前往 true,那么 postHandle 和 afterCompletion 不会被实行。
那这个办法有什么用呢?实在可以做一些接口被挪用前的预处置,比方用户权限校验。
package com.chenpi;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.lang.Nullable;import org.springframework.stereotype.Component;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.HandlerInterceptor;/** * @Description 用户权限验证阻拦 * @Author 陈皮 * @Date 2021/6/27 * @Version 1.0 */@Componentpublic class UserPermissionInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; // 获取用户权限校验表明 UserAuthenticate userAuthenticate = handlerMethod.getMethod().getAnnotation(UserAuthenticate.class); if (null == userAuthenticate) { userAuthenticate = handlerMethod.getMethod().getDeclaringClass() .getAnnotation(UserAuthenticate.class); } if (userAuthenticate != null && userAuthenticate.permission()) { // 验证用户信息 UserContext userContext = userContextManager.getUserContext(request); if (null == userContext) { return false; } } } return true; }}
postHandle
postHandle 后置处置,会在 HandlerAdapter 挪用处置器之后,但在 DispatcherServlet 渲染视图之前被挪用。可以在此对 ModelAndView 做一些分外的处置。可以复杂了解为 controller 接口被挪用之后实行。
留意,此办法在实行链中的实行次序是倒着实行的,即先声明的阻拦器后实行。
afterCompletion
afterCompletion 完成之后,在哀求处置完之后被实行,也便是渲染完视图之后。一样平常用于做一些资源的清算事情,共同 preHandle 盘算接口实行工夫等。
留意,和 postHandle 一样,此办法在实行链中的实行次序也是倒着实行的,即先声明的阻拦器后实行。
@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) { // 哀求完后,扫除以后线程的用户信息 UserContextHolder.removeUserContext();}
注册阻拦器
留意,ag九游会自界说的阻拦器要经过 WebMvcConfigurer 的完成类举行注册,才干失效。
package com.yzj.ehr.common.config;import com.yzj.ehr.common.context.UserContextResolver;import org.springframework.stereotype.Component;import org.springframework.web.method.support.HandlerMethodArgumentResolver;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import com.yzj.ehr.common.interceptor.UserPermissionInterceptor;@Componentpublic class WebAppConfigurer implements WebMvcConfigurer { private UserPermissionInterceptor userPermissionInterceptor; public WebAppConfigurer(final UserPermissionInterceptor userPermissionInterceptor) { this.userPermissionInterceptor = userPermissionInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { // 婚配一切接口,扫除/base/test接口 registry.addInterceptor(userPermissionInterceptor).addPathPatterns("/**") .excludePathPatterns("/base/test"); }}
作者:陈皮的JavaLib 原文链接:https://blog.csdn.net/chenlixiao007/article/details/118371689