最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2019年06月20日 14:41:21   作者:郭尋撫  
這篇文章主要介紹了在spring-boot工程中添加spring mvc攔截器,Spring MVC的攔截器(Interceptor)不是Filter,同樣可以實現(xiàn)請求的預(yù)處理、后處理。,需要的朋友可以參考下

1. 認識攔截器

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

  • 實現(xiàn)攔截器
  • 注冊攔截器

1.1 實現(xiàn)攔截器

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

public class LoginInterceptor extends HandlerInterceptorAdapter {
/**
*預(yù)處理回調(diào)方法,實現(xiàn)處理器的預(yù)處理(如登錄檢查)。
*第三個參數(shù)為響應(yīng)的處理器,即controller。
*返回true,表示繼續(xù)流程,調(diào)用下一個攔截器或者處理器。
*返回false,表示流程中斷,通過response產(chǎn)生響應(yīng)。
*/
@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;
}
/**
*當(dāng)前請求進行處理之后,也就是Controller 方法調(diào)用之后執(zhí)行,
*但是它會在DispatcherServlet 進行視圖返回渲染之前被調(diào)用。
*此時我們可以通過modelAndView對模型數(shù)據(jù)進行處理或?qū)σ晥D進行處理。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, 
Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("-------------------postHandle");
}
/**
*方法將在整個請求結(jié)束之后,也就是在DispatcherServlet 渲染了對應(yīng)的視圖之后執(zhí)行。
*這個方法的主要作用是用于進行資源清理工作的。
*/
@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 攔截器的應(yīng)用場景

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

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

2. 原理

2.1 工作原理

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

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

2.2 攔截器工作流程

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

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

2.2.1正常流程
注意兩個攔截器在執(zhí)行preHandle方法和執(zhí)行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 中斷流程

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

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

2.3 和Filter共存時的執(zhí)行順序

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot 項目中的圖片處理策略之本地存儲與路徑映射

    SpringBoot 項目中的圖片處理策略之本地存儲與路徑映射

    在SpringBoot項目中,靜態(tài)資源存放在static目錄下,使得前端可以通過URL來訪問這些資源,我們就需要將文件系統(tǒng)的文件路徑與URL建立一個映射關(guān)系,把文件系統(tǒng)中的文件當(dāng)成我們的靜態(tài)資源即可,本文給大家介紹SpringBoot本地存儲與路徑映射的相關(guān)知識,感興趣的朋友一起看看吧
    2023-12-12
  • Java實現(xiàn)文件上傳服務(wù)器和客戶端

    Java實現(xiàn)文件上傳服務(wù)器和客戶端

    這篇文章主要為大家詳細介紹了Java實現(xiàn)文件上傳服務(wù)器和客戶端,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • spring定時器定時任務(wù)到時間未執(zhí)行問題的解決

    spring定時器定時任務(wù)到時間未執(zhí)行問題的解決

    這篇文章主要介紹了spring定時器定時任務(wù)到時間未執(zhí)行問題的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 實例講解Java設(shè)計模式編程中的OCP開閉原則

    實例講解Java設(shè)計模式編程中的OCP開閉原則

    這篇文章主要介紹了Java設(shè)計模式編程中的開閉原則,開閉原則的大意被作者總結(jié)為用抽象構(gòu)建框架,用實現(xiàn)擴展細節(jié),需要的朋友可以參考下
    2016-02-02
  • Spring中使用JSR303請求約束判空的實現(xiàn)

    Spring中使用JSR303請求約束判空的實現(xiàn)

    這篇文章主要介紹了Spring中使用JSR303請求約束判空的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Netty分布式ByteBuf的分類方式源碼解析

    Netty分布式ByteBuf的分類方式源碼解析

    這篇文章主要為大家介紹了Netty分布式ByteBuf的分類方式源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • Gradle相對于Maven有哪些優(yōu)點

    Gradle相對于Maven有哪些優(yōu)點

    這篇文章主要介紹了Gradle相對于Maven有哪些優(yōu)點,幫助大家選擇合適的自動構(gòu)建工具,更好的構(gòu)建項目,感興趣的朋友可以了解下
    2020-10-10
  • java實現(xiàn)簡易版簡易版dubbo

    java實現(xiàn)簡易版簡易版dubbo

    dubbo是阿里開源的rpc框架,目前是apache頂級開源項目,可以用來構(gòu)建微服務(wù)。本文主要介紹了如何通過java實現(xiàn)簡易版的dubbo,感興趣的小伙伴可以了解一下
    2021-11-11
  • Java 高精度的大數(shù)字運算方式

    Java 高精度的大數(shù)字運算方式

    這篇文章主要介紹了Java 高精度的大數(shù)字運算方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java的堵塞隊列BlockingQueue詳解

    Java的堵塞隊列BlockingQueue詳解

    這篇文章主要介紹了Java的堵塞隊列BlockingQueue詳解,阻塞隊列常用于生產(chǎn)者和消費者的場景,生產(chǎn)者是向隊列里添加元素的線程,消費者是從隊列里取元素的線程,需要的朋友可以參考下
    2023-12-12

最新評論

新疆| 秀山| 道孚县| 襄樊市| 观塘区| 沁阳市| 古交市| 怀安县| 鹤山市| 永州市| 广昌县| 余庆县| 秦安县| 花莲县| 大兴区| 蓬溪县| 平江县| 密山市| 门源| 电白县| 宝坻区| 磴口县| 安康市| 晋江市| 禄劝| 株洲县| 博乐市| 大田县| 旬邑县| 乾安县| 九江市| 靖边县| 邢台县| 宁国市| 华蓥市| 轮台县| 唐海县| 天台县| 吉水县| 潍坊市| 桐庐县|