日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

一篇文章教你弄懂 SpringMvc中的HandlerInterceptor

發布時間:2025/1/21 javascript 68 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一篇文章教你弄懂 SpringMvc中的HandlerInterceptor 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章列表

      • 一、HandlerInterceptor簡介
      • 一、HandlerInterceptor應用實例

寫在前面:
我是「境里婆娑」。我還是從前那個少年,沒有一絲絲改變,時間只不過是考驗,種在心中信念絲毫未減,眼前這個少年,還是最初那張臉,面前再多艱險不退卻。
寫博客的目的就是分享給大家一起學習交流,如果您對 Java感興趣,可以關注我,我們一起學習。

前言:HandlerInterceptor在項目中經常用到,比如發送一個請求希望在調用業務代碼之前對這個請求做一些操作,或者調用業務完成之后做一些操作。實現HandlerInterceptor 接口做具體的業務即可。

一、HandlerInterceptor簡介

spring mvc的攔截器是只攔截controller而不攔截jsp,html 頁面文件的。這就用到過濾器filter了,filter是在servlet前執行的,你也可以理解成過濾器中包含攔截器,一個請求過來 ,先進行過濾器處理,看程序是否受理該請求 。 過濾器放過后 , 程序中的攔截器進行處理 。

HandlerInterceptor攔截的是請求地址,所以針對請求地址做一些驗證、預處理等操作比較合適。

定義一個Interceptor 非常簡單方式也有幾種,我這里簡單列舉兩種

  • 類要實現Spring 的HandlerInterceptor 接口
  • 類繼承實現了HandlerInterceptor 接口的類,例如 已經提供的實現了HandlerInterceptor 接口的抽象類HandlerInterceptorAdapter

HandlerInterceptor執行順序圖:

SpringMvc5.0版本HandlerInterceptor接口里面方法已經改為默認方法

public interface HandlerInterceptor {/*** 預處理回調方法,實現處理器的預處理(如檢查登陸),第三個參數為響應的處理器,自定義Controller* 返回值:true表示繼續流程(如調用下一個攔截器或處理器);* false表示流程中斷(如登錄檢查失敗),不會繼續調用其他的攔截器或處理器,此時我們需要通過response來產生響應;*/default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {return true;}/*** 后處理回調方法,實現處理器的后處理(但在渲染視圖之前),此時我們可以通過modelAndView(模型和視圖對象)對模型數據進行處理或對視圖進行處理,modelAndView也可能為null。*/default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable ModelAndView modelAndView) throws Exception {}/*** 整個請求處理完畢回調方法,即在視圖渲染完畢時回調,如性能監控中我們可以在此記錄結束時間并輸出消耗時間,還可以進行一些資源清理,類似于try-catch-finally中的finall* 但僅調用處理器執行鏈中preHandle返回true的攔截器的afterCompletion。*/default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable Exception ex) throws Exception {}}

運行流程圖:

正常流程圖:

異常流程圖:

 運行流程總結如下:

  • 攔截器執行順序是按照Spring配置文件中定義的順序而定的。

  • 會先按照順序執行所有攔截器的preHandle方法,一直遇到return false為止,比如第二個preHandle方法是return false,則第三個以及以后所有攔截器都不會執行。若都是return true,則按順序加載完preHandle方法。

  • 然后執行主方法(自己的controller接口),若中間拋出異常,則跟return false效果一致,不會繼續執行postHandle,只會倒序執行afterCompletion方法。

  • 在主方法執行完業務邏輯(頁面還未渲染數據)時,按倒序執行postHandle方法。若第三個攔截器的preHandle方法return false,則會執行第二個和第一個的postHandle方法和afterCompletion(postHandle都執行完才會執行這個,也就是頁面渲染完數據后,執行after進行清理工作)方法。(postHandle和afterCompletion都是倒序執行)

一、HandlerInterceptor應用實例

自定義HandlerInterceptor

@Component public class RememberAuthenticationInterceptor implements HandlerInterceptor {@Autowiredprivate SysUserService userService;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {Subject subject = SecurityUtils.getSubject();if (subject.isAuthenticated()) {return true;}Session session = subject.getSession(true);if (session.getAttribute(SessionConst.USER_SESSION_KEY) != null) {return true;}if(!subject.isRemembered()) {log.warn("未設置“記住我”,跳轉到登錄頁...");response.sendRedirect(request.getContextPath() + "/passport/login");return false;}try {Long userId = Long.parseLong(subject.getPrincipal().toString());User user = userService.getByPrimaryKey(userId);UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), PasswordUtil.decrypt(user.getPassword(), user.getUsername()), true);subject.login(token);session.setAttribute(SessionConst.USER_SESSION_KEY, user);log.info("[{}] - 已自動登錄", user.getUsername());} catch (Exception e) {log.error("自動登錄失敗", e);response.sendRedirect(request.getContextPath() + "/passport/login");return false;}return true;} }

HandlerInterceptor配置

@Configuration public class WebMvcConfig implements WebMvcConfigurer {@Autowiredprivate RememberAuthenticationInterceptor rememberAuthenticationInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(rememberAuthenticationInterceptor).excludePathPatterns("/passport/**", "/error/**", "/assets/**", "/getKaptcha/**", "/websocket", "favicon.ico").addPathPatterns("/**");} }

addPathPatterns需要攔截的路徑,excludePathPatterns攔截時候需要排除的路徑。

HandlerInterceptor應用場景

  • 日志記錄,可以記錄請求信息的日志,以便進行信息監控、信息統計、計算PV(Page View)等等。
  • 權限檢查:如登陸檢測,進入處理器檢測是否登陸,如果沒有直接返回到登陸頁面。
  • 性能監控:有時候系統在某段時間莫名其妙的慢,可以通過攔截器在進入處理器之前記錄開始時間,在處理完后記錄結束時間,從而得到該請求的處理時間(如果有反向代理,如apache可以自動記錄);

到此SpringMvc中的HttpMessageConverter介紹完畢。如果還有不明白的可以留言。
—————————————————————————————————
由于本人水平有限,難免有不足,懇請各位大佬不吝賜教!

總結

以上是生活随笔為你收集整理的一篇文章教你弄懂 SpringMvc中的HandlerInterceptor的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。