国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

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

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

HandlerInterceptor 允許定制 handler 處理器執行鏈的工作流接口。我們可以自定義攔截器用于攔截 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 {}}

這三個方法的執行順序圖如下:

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

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();}注冊攔截器

注意,我們自定義的攔截器要通過 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;/** * @Description 注冊攔截器 * @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'); }}

到此這篇關于SpringBoot 攔截器妙用你真的了解嗎的文章就介紹到這了,更多相關SpringBoot 攔截器內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 国产欧美日韩综合精品一区二区 | 91久久国产露脸精品免费 | 在线欧美日韩精品一区二区 | 成人a级高清视频在线观看 成人a毛片 | 国产成人毛片视频不卡在线 | 特大一级aaaaa毛片 | 97久久精品视频 | 国产亚洲人成a在线v网站 | 草草视频手机在线观看视频 | 亚洲天天在线 | 久久久久欧美国产精品 | 亚洲厕拍| 国产在线精品一区二区高清不卡 | 免费在线观看的毛片 | 日本高清视频一区二区 | 亚洲成年人网址 | 九一色视频 | 另类亚洲孕妇分娩网址 | 欧美精品99久久久久久人 | 美国一级做a一级视频 | 成人男男黄网色视频免费 | 毛片精品| 俄罗斯美女在线观看一区 | 成人亚洲精品一区 | 色怡红院| 久久综合婷婷香五月 | 成人欧美视频在线观看 | 黄色毛片免费在线观看 | 亚洲国产人成中文幕一级二级 | 日本vs欧美一区二区三区 | 国产黄色一级毛片 | 日韩精品久久久免费观看夜色 | 欧美成人短视频 | 国产一起色一起爱 | 特黄a大片免费视频 | 免费人成在线观看播放国产 | 黄网在线观看免费网站台湾swag | 一本久道综合久久精品 | 免费毛片网站 | 99热国产免费 | 国产99视频精品一区 |