javascript
一篇文章教你弄懂 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接口里面方法已經改為默認方法
運行流程圖:
正常流程圖:
異常流程圖:
運行流程總結如下:
-
攔截器執行順序是按照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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一篇文章教你弄懂SpringMvc中的H
- 下一篇: 全网最详细SpringBatch批处理读