一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 在spring-boot工程中添加spring mvc攔截器

在spring-boot工程中添加spring mvc攔截器

2019-06-26 13:13郭尋撫 Java教程

這篇文章主要介紹了在spring-boot工程中添加spring mvc攔截器,Spring MVC的攔截器(Interceptor)不是Filter,同樣可以實現請求的預處理、后處理。,需要的朋友可以參考下

1. 認識攔截器

Spring MVC的攔截器(Interceptor)不是Filter,同樣可以實現請求的預處理、后處理。使用攔截器僅需要兩個步驟:

  • 實現攔截器
  • 注冊攔截器

1.1 實現攔截器

實現攔截器可以自定義實現HandlerInterceptor接口,也可以通過繼承HandlerInterceptorAdapter類,后者是前者的實現類。下面是攔截器的一個實現的例子,目的是判斷用戶是否登錄。如果preHandle方法return true,則繼續后續處理。

public class LoginInterceptor extends HandlerInterceptorAdapter {
/**
*預處理回調方法,實現處理器的預處理(如登錄檢查)。
*第三個參數為響應的處理器,即controller。
*返回true,表示繼續流程,調用下一個攔截器或者處理器。
*返回false,表示流程中斷,通過response產生響應。
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
Object handler) throws Exception {
System.out.println("-------------------preHandle");
// 驗證用戶是否登陸
Object obj = request.getSession().getAttribute("username");
if (obj == null || !(obj instanceof String)) {
response.sendRedirect(request.getContextPath() + "/index.html");
return false;
}
return true;
}
/**
*當前請求進行處理之后,也就是Controller 方法調用之后執行,
*但是它會在DispatcherServlet 進行視圖返回渲染之前被調用。
*此時我們可以通過modelAndView對模型數據進行處理或對視圖進行處理。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, 
Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("-------------------postHandle");
}
/**
*方法將在整個請求結束之后,也就是在DispatcherServlet 渲染了對應的視圖之后執行。
*這個方法的主要作用是用于進行資源清理工作的。
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
Object handler, Exception ex) throws Exception {
System.out.println("-------------------afterCompletion");
}
}

1.2 注冊攔截器

為了使自定義的攔截器生效,需要注冊攔截器到spring容器中,具體的做法是繼承WebMvcConfigurerAdapter類,覆蓋其addInterceptors(InterceptorRegistry registry)方法。最后別忘了把Bean注冊到Spring容器中,可以選擇@Component 或者 @Configuration。

@Component
public class InterceptorConfiguration extends WebMvcConfigurerAdapter{
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注冊攔截器
InterceptorRegistration ir = registry.addInterceptor(new LoginInterceptor());
// 配置攔截的路徑
ir.addPathPatterns("/**");
// 配置不攔截的路徑
ir.excludePathPatterns("/**.html");
// 還可以在這里注冊其它的攔截器
//registry.addInterceptor(new OtherInterceptor()).addPathPatterns("/**");
}
}

1.3 攔截器的應用場景

攔截器本質上是面向切面編程(AOP),符合橫切關注點的功能都可以放在攔截器中來實現,主要的應用場景包括:

  1. 登錄驗證,判斷用戶是否登錄。
  2. 權限驗證,判斷用戶是否有權限訪問資源。
  3. 日志記錄,記錄請求日志,以便統計請求訪問量。
  4. 處理cookie、本地化、國際化、主題等。
  5. 性能監控,監控請求處理時長等。

2. 原理

2.1 工作原理

攔截器不是Filter,卻實現了Filter的功能,其原理在于:

  • 所有的攔截器(Interceptor)和處理器(Handler)都注冊在HandlerMapping中。
  • Spring MVC中所有的請求都是由DispatcherServlet分發的。
  • 當請求進入DispatcherServlet.doDispatch()時候,首先會得到處理該請求的Handler(即Controller中對應的方法)以及所有攔截該請求的攔截器。攔截器就是在這里被調用開始工作的。

2.2 攔截器工作流程

一個攔截器,只有preHandle方法返回true,postHandle、afterCompletion才有可能被執行;如果preHandle方法返回false,則該攔截器的postHandle、afterCompletion必然不會被執行。

假設我們有兩個攔截器,例如叫Interceptor1和Interceptor2,當一個請求過來,正常的流程和中斷的流程分別如下。

2.2.1正常流程
注意兩個攔截器在執行preHandle方法和執行postHandle、afterCompletion方法時,順序是顛倒的。

  1.  Interceptor1.preHandle
  2. Interceptor2.preHandle
  3.  Controller處理請求
  4. Interceptor2.postHandle
  5. Interceptor1.postHandle
  6. 渲染視圖
  7.  Interceptor2.afterCompletion
  8.  Interceptor1.afterCompletion

2.2.2 中斷流程

假設執行Interceptor2.preHandle中報錯,那么流程被中斷,之前被執行過的攔截器的afterCompletion仍然會執行。在本例中,即執行了Interceptor1.afterCompletion。

1. Interceptor1.preHandle
2. Interceptor2.preHandle
//中間流程被中斷,不再執行
3. Interceptor1.afterCompletion

2.3 和Filter共存時的執行順序

攔截器是在DispatcherServlet這個servlet中執行的,因此所有的請求最先進入Filter,最后離開Filter。其順序如下。

Filter->Interceptor.preHandle->Handler->Interceptor.postHandle->Interceptor.afterCompletion->Filter

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 东方影视欧美天天影院 | 午夜综合 | 暖暖中国免费观看高清完整版 | 青青青手机在线视频 | 欧美日韩国产一区二区三区不卡 | 国产hd老太婆 | 香港论理午夜电影网 | 色猪视频 | 免费网站直接进入 | 污到湿的爽文免费阅读 | 99精品国产自在现线观看 | 欧亚尺码专线欧洲s码wmy | 星空无限传媒视频在线观看视频 | 午夜AV国产欧美亚洲高清在线 | 日本videos有奶水的hd | 动漫jk美女被爆羞羞漫画 | 美女奶口隐私免费视频网站 | 欧美成人在线影院 | 歪歪视频在线播放无遮挡 | 情乱奶水欲 | 国内自拍成人网在线视频 | sese在线观看 | 精品国产一级毛片大全 | 亚洲AV久久无码精品九号软件 | 日韩精品欧美激情国产一区 | fquer老师 | 国产精品亚洲片在线不卡 | 日韩视频在线精品视频免费观看 | 美女胸又大又黄又www小说 | 韩国三级hd中文字幕李采潭 | 女同志 videos| 喷奶水榨乳ova动漫无修 | 插美女b| 香蕉国产精品偷在线播放 | 韩日视频在线观看 | 动漫a级片 | 国产成人精品999在线 | 小SAO货叫大声点妓女 | 国产成人久久精品一区二区三区 | 操碰97| 成年人视频在线播放 |