色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

SpringBoot 攔截器妙用你真的了解嗎

瀏覽:31日期:2023-02-28 10:31:14
HandlerInterceptor 詳解

HandlerInterceptor 允許定制 handler 處理器執(zhí)行鏈的工作流接口。我們可以自定義攔截器用于攔截 handlers 處理器(你可以理解為 controller 層的接口),從而可以添加一些共同的重復(fù)性的處理行為(例如接口鑒權(quán),接口日志記錄,性能監(jiān)控等),而不用修改每一個(gè) handler 的實(shí)現(xiàn)。

注意,此基于 SpringBoot 2.3.12.RELEASE 版本講解。

HandlerInterceptor 接口只有三個(gè)默認(rèn)空實(shí)現(xiàn)方法,在低版本中這三個(gè)方法不是默認(rèn)方法,而是抽象方法。

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 {}}

這三個(gè)方法的執(zhí)行順序圖如下:

SpringBoot 攔截器妙用你真的了解嗎

preHandle

preHandle 前置處理,攔截一個(gè)處理器(handler)的執(zhí)行,preHandle 方法會(huì)在 HandlerMapping 確定一個(gè)適當(dāng)?shù)奶幚砥鲗?duì)象之后,但在 HandlerAdapter 調(diào)用處理器之前被調(diào)用。可以簡單理解為 controller 接口被調(diào)用之前執(zhí)行。

Intercepter 是鏈?zhǔn)降模褪且粋€(gè)接著一個(gè)執(zhí)行。如果此方法返回 true,則會(huì)執(zhí)行下一個(gè)攔截器或者直接執(zhí)行處理器。如果此方法返回 false 或者拋出異常則終止執(zhí)行鏈,也不再調(diào)用處理器。

注意,此方法如果不返回 true,那么 postHandle 和 afterCompletion 不會(huì)被執(zhí)行。

那這個(gè)方法有什么用呢?其實(shí)可以做一些接口被調(diào)用前的預(yù)處理,例如用戶權(quán)限校驗(yàn)。

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 用戶權(quán)限驗(yàn)證攔截 * @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; // 獲取用戶權(quán)限校驗(yàn)注解 UserAuthenticate userAuthenticate = handlerMethod.getMethod().getAnnotation(UserAuthenticate.class); if (null == userAuthenticate) {userAuthenticate = handlerMethod.getMethod().getDeclaringClass().getAnnotation(UserAuthenticate.class); } if (userAuthenticate != null && userAuthenticate.permission()) {// 驗(yàn)證用戶信息UserContext userContext = userContextManager.getUserContext(request);if (null == userContext) { return false;} }}return true; }}postHandle

postHandle 后置處理,會(huì)在 HandlerAdapter 調(diào)用處理器之后,但在 DispatcherServlet 渲染視圖之前被調(diào)用。可以在此對(duì) ModelAndView 做一些額外的處理。可以簡單理解為 controller 接口被調(diào)用之后執(zhí)行。

注意,此方法在執(zhí)行鏈中的執(zhí)行順序是倒著執(zhí)行的,即先聲明的攔截器后執(zhí)行。

afterCompletion

afterCompletion 完成之后,在請(qǐng)求處理完之后被執(zhí)行,也就是渲染完視圖之后。一般用于做一些資源的清理工作,配合 preHandle 計(jì)算接口執(zhí)行時(shí)間等。

注意,和 postHandle 一樣,此方法在執(zhí)行鏈中的執(zhí)行順序也是倒著執(zhí)行的,即先聲明的攔截器后執(zhí)行。

@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) { // 請(qǐng)求完后,清除當(dāng)前線程的用戶信息 UserContextHolder.removeUserContext();}注冊(cè)攔截器

注意,我們自定義的攔截器要通過 WebMvcConfigurer 的實(shí)現(xiàn)類進(jìn)行注冊(cè),才能生效。

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;/** * @Description 注冊(cè)攔截器 * @Author 陳皮 * @Date 2021/6/27 * @Version 1.0 */@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'); }}

到此這篇關(guān)于SpringBoot 攔截器妙用你真的了解嗎的文章就介紹到這了,更多相關(guān)SpringBoot 攔截器內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 国产一国产一级毛片视频在线 | 播播网手机在线播放 | cao草棚视频网址成人 | 国产伦精品一区二区三区 | 久久视频精品线视频在线网站 | 日本加勒比网站 | 欧美xx在线观看 | 天天拍拍夜夜出水 | 5x性区m免费毛片视频看看 | 国产黄色一级毛片 | 亚洲精品在线看 | 国产成人小视频 | 国产福利社区 | 欧美一级性视频 | 精品久久在线 | 免费看一级欧美毛片 | 男女扒开双腿猛进入爽爽视频 | 美女黄色毛片免费看 | 久久久久免费观看 | 国产麻豆一级在线观看 | 三级全黄的全黄三级三级播放 | 国产三级精品三级 | 成人国产网站v片免费观看 成人国产午夜在线视频 | 国产爽的冒白浆的视频高清 | 黄 色 成 年 人小说 | 国内自拍视频一区二区三区 | 日韩a级 | 久草免费新视频 | 日韩欧美国产高清在线观看 | 97成人在线| 色黄啪啪18周岁以下禁止观看 | 萝控精品福利视频一区 | 欧美国产成人一区二区三区 | 国产欧美在线播放 | 午夜伦4480yy妇女久久久 | 亚洲欧美一区二区三区综合 | 一区二区三区四区国产精品 | 京东一热本色道久久爱 | 亚洲国产网站 | 成人在线综合 | 免费一区二区三区久久 |