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

SpringBoot攔截器的使用介紹

 更新時(shí)間:2022年01月02日 11:13:23   作者:cHAngXdoN  
大家好,本篇文章主要講的是SpringBoot攔截器的使用介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下

定義攔截器

攔截器:所謂攔截器,就是能夠在進(jìn)行某個(gè)操作之前攔截請(qǐng)求,如果請(qǐng)求符合條件就允許在往下執(zhí)行。比如說(shuō),海關(guān)就是一個(gè)攔截器,他攔截進(jìn)出口的貨物,如果貨物滿足進(jìn)出口條件,則放行,否則就攔截,退回處理。

定義攔截器的幾種方式:

實(shí)現(xiàn)HandleInterceptor接口

自定義攔截器類實(shí)現(xiàn)HandleInterceptor接口,并使用@Component注解標(biāo)注為一個(gè)組件。

public class MySelfInterceptor implements HandlerInterceptor {
	@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    	System.out.println("在業(yè)務(wù)處理器處理請(qǐng)求之前被調(diào)用");
    	return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
		System.out.println("在業(yè)務(wù)處理器處理請(qǐng)求執(zhí)行完成后,生成視圖之前執(zhí)行");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		System.out.println("在DispatcherServlet完全處理完請(qǐng)求后被調(diào)用");
    }
} 

根據(jù)三種情況,可以在不同的方法針對(duì)請(qǐng)求進(jìn)行額外的處理。
在preHandle中,可以進(jìn)行權(quán)限校驗(yàn),安全控制。
在postHandle中,可以對(duì)返回來(lái)的ModelAndView進(jìn)行處理,這個(gè)時(shí)候還未渲染視圖。
在afterCompletion中,請(qǐng)求已經(jīng)完成,頁(yè)面已經(jīng)渲染,數(shù)據(jù)已經(jīng)返回。這個(gè)時(shí)候可以做一些資源清理,或者記錄請(qǐng)求調(diào)用時(shí)間,做性能監(jiān)控

繼承HandleInterceptorAdapter類

自定義攔截器類繼承HandleInterceptor接口的實(shí)現(xiàn)類HandleInterceptorAdapter來(lái)定義,并使用@Component注解標(biāo)注為一個(gè)組件。建議使用此方式可以根據(jù)需要覆蓋一些方法

@Component
public class MyInterceptor extends HandlerInterceptorAdapter {

    public SingleLoginInterceptor() {
        super();
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        super.afterCompletion(request, response, handler, ex);
    }

    @Override
    public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        super.afterConcurrentHandlingStarted(request, response, handler);
    }
}

可以看到HandlerInterceptorAdapter類底層是實(shí)現(xiàn)了HandlerInterceptor接口,多了兩個(gè)方法,要比
實(shí)現(xiàn)HandlerInterceptor接口的方式功能強(qiáng)大。
這兩個(gè)方法都是HandlerInterceptorAdapter類實(shí)現(xiàn)的org.springframework.web.servlet.AsyncHandlerInterceptor接口提供的,而AsyncHandlerInterceptor接口又繼承了HandlerInterceptor接口,所以HandlerInterceptorAdapter底層是實(shí)現(xiàn)類HandlerInterceptor接口。

實(shí)現(xiàn)WebRequestInterceptor接口

自定義攔截器類實(shí)現(xiàn)WebRequestInterceptor接口,并使用@Component注解標(biāo)注為一個(gè)組件。

@Component
public class MyInterceptor implements WebRequestInterceptor {
    
    @Override
    public void preHandle(WebRequest webRequest) throws Exception {
        
    }

    @Override
    public void postHandle(WebRequest webRequest, ModelMap modelMap) throws Exception {

    }

    @Override
    public void afterCompletion(WebRequest webRequest, Exception e) throws Exception {

    }
}

兩個(gè)實(shí)現(xiàn)接口方式的異同點(diǎn) 相同點(diǎn) 都可以實(shí)現(xiàn)controller層的攔截請(qǐng)求 不同點(diǎn)
1.WebRequestInterceptor的入?yún)ebRequest是包裝了HttpServletRequest 和HttpServletResponse的,通過(guò)WebRequest獲取Request中的信息更簡(jiǎn)便。
2.WebRequestInterceptor的preHandle是沒(méi)有返回值的,說(shuō)明該方法中的邏輯并不影響后續(xù)的方法執(zhí)行,所以這個(gè)接口實(shí)現(xiàn)就是為了獲取Request中的信息,或者預(yù)設(shè)一些參數(shù)供后續(xù)流程使用。
3.HandlerInterceptor的功能更強(qiáng)大也更基礎(chǔ),可以在preHandle方法中就直接拒絕請(qǐng)求進(jìn)入controller方法。
4.使用場(chǎng)景:這個(gè)在上條已經(jīng)說(shuō)了,如果想更方便獲取HttpServletRequest的信息就使用WebRequestInterceptor,當(dāng)然這些HandlerInterceptor都能做,只不過(guò)要多寫點(diǎn)代碼

實(shí)現(xiàn)RequestInterceptor接口

自定義類實(shí)現(xiàn)RequestInterceptor接口,此方式為微服務(wù)Feign調(diào)用的自定義攔截器,實(shí)現(xiàn)各個(gè)微服務(wù)之間的參數(shù)傳遞。

@Configuration
public class CenterinsRequestInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {

    }
}

小插曲 @Configuration和@Component區(qū)別

這里使用了@Configuration注解而不是@Component,其實(shí)@Configuration本質(zhì)上也是一個(gè)@Component,只不過(guò)前者描述的類中所有用@Bean標(biāo)記的方法都會(huì)由CGLIB動(dòng)態(tài)代理執(zhí)行,在首次調(diào)用的時(shí)候會(huì)執(zhí)行,然后把執(zhí)行結(jié)果放到Spring上下文,之后對(duì)該方法的調(diào)用都是從Spring上下文上取的結(jié)果,所以都是指同一個(gè)實(shí)例。而使用了@Component,所有用@Bean標(biāo)記的方法都是純Java調(diào)用,每次都是生成不同的實(shí)例對(duì)象。如果要讓使用了@Compnent注解的類中其@Bean標(biāo)記的方法生成都是同一個(gè)實(shí)例,只需要使用@AutoWired標(biāo)記屬性,自動(dòng)注入即可。

@Configuration
public class MyBeanConfig {
 
    @Bean
    public Country country(){
        return new Country();
    }
 
    @Bean
    public UserInfo userInfo(){
        return new UserInfo(country());
    }
 
}

 // 以上代碼 等同于以下代碼 
 // 以下代碼去掉Autowired注入,則country方法是不同的實(shí)例對(duì)象。
 
@Component
public class MyBeanConfig {
 
    @Autowired
    private Country country;
 
    @Bean
    public Country country(){
        return new Country();
    }
 
    @Bean
    public UserInfo userInfo(){
        return new UserInfo(country);
    }
 
}

注冊(cè)攔截器

注冊(cè)攔截器在springboot中直接使用注解便可實(shí)現(xiàn)。

繼承WebMvcConfigurerAdapter類

 1.創(chuàng)建一個(gè)自定義類,繼承WebMvcConfigurerAdapter類重寫addInterceptors方法。

@Configuration
public class WebCofiguration extends WebMvcConfigurerAdapter {
    public void addInterceptors(InterceptorRegistry registry) {
    		// 將自己定義的攔截器注入進(jìn)來(lái)進(jìn)行攔截操作
        registry.addInterceptor(new MySelfInterceptor ())
                .addPathPatterns("/**")
                .excludePathPatterns("/logout");
                //過(guò)濾器可以添加多個(gè),這里的addPathPatterns的/**是對(duì)所有的請(qǐng)求都做攔截。
                //excludePathPatterns代表排除url的攔截路徑,即不攔截
    }
}

此類在SpringBoot2.0以后已經(jīng)廢除,但仍可使用。推薦使用以下兩種方式來(lái)代替此方式。

繼承WebMvcConfigurationSupport類

 2.創(chuàng)建一個(gè)自定義類繼承WebMvcConfigurationSupport類,實(shí)現(xiàn)addInterceptors。

@Configuration
public class MyInterceptorConfig extends WebMvcConfigurationSupport {

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }
}

此方式會(huì)導(dǎo)致默認(rèn)的靜態(tài)資源被攔截,這就需要我們手動(dòng)將靜態(tài)資源放開。
除了重寫方法外還需要重寫addResourceHandlers方法來(lái)釋放靜態(tài)資源

@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
    super.addResourceHandlers(registry);
}

實(shí)現(xiàn)WebMvcConfigurer接口

 3.創(chuàng)建一個(gè)自定義類實(shí)現(xiàn)WebMvcConfigurer接口,重寫addInterceptors方法。

@Configuration
public class MyInterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 實(shí)現(xiàn)WebMvcConfigurer不會(huì)導(dǎo)致靜態(tài)資源被攔截
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }
}

此方式不會(huì)攔截靜態(tài)資源

應(yīng)用場(chǎng)景

由于這兩種方式的不同:
繼承 WebMvcConfigurationSupport類的方式推薦用在前后端分離的項(xiàng)目中,后臺(tái)不需要訪問(wèn)靜態(tài)資源(就不需要放開靜態(tài)資源了),當(dāng)然也可以在前后端不分離中,如果需要訪問(wèn)靜態(tài)資源使用上面的方式重寫addResourceHandlers方法即可;
實(shí)現(xiàn) WebMvcConfigure接口的方式推薦用在非前后端分離的項(xiàng)目中,因?yàn)樾枰x取一些圖片、css、js文件等等,當(dāng)然也可以使用在前后端分離項(xiàng)目。

攔截器執(zhí)行流程

單個(gè)攔截器

對(duì)單個(gè)攔截器執(zhí)行流程解釋如下:
程序首先會(huì)執(zhí)行攔截器類中的preHandle()方法,如果該方法返回true,則程序會(huì)繼續(xù)向下執(zhí)行處理器中的方法,否則程序?qū)⒉辉偻吕^續(xù)執(zhí)行。在業(yè)務(wù)處理器(即控制器Controller類)處理完請(qǐng)求后,會(huì)執(zhí)行postHandle()方法,然后會(huì)通過(guò)DispatcherServlet向客戶端返回響應(yīng),在DispatcherServlet處理完請(qǐng)求后,才會(huì)執(zhí)行afterCompletion()方法。
因此單個(gè)攔截器的執(zhí)行流程:
prehandle()——Handle(也就是控制器里的方法)——postHandle()——afterCompletion()。

多個(gè)攔截器

在大型的企業(yè)級(jí)項(xiàng)目中,通常會(huì)配置多個(gè)攔截器來(lái)實(shí)現(xiàn)不同的功能。例如我們自定義了三個(gè)攔截器A、B、C。并將它們都注冊(cè)到同一個(gè)攔截器配置類中,如下圖

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AInterceptor())
                .addPathPatterns("/**");

        registry.addInterceptor(new BInterceptor())
                .addPathPatterns("/**");

        registry.addInterceptor(new CInterceptor())
                .addPathPatterns("/**");
    }
}

它們的preHandle()方法會(huì)按照配置文件中攔截器的配置順序執(zhí)行,而它們的postHandle()和afterCompletion()方法則會(huì)按照配置順序的反序執(zhí)行。
因此當(dāng)前我們的三個(gè)攔截器執(zhí)行順序如下:
preHandleA——preHandleB——preHandleC——Handle——postHandleC——postHandleB——postHandleA——afterCompletionC——afterCompletionB——afterCompletionA

總結(jié)

到此這篇關(guān)于SpringBoot攔截器的使用介紹的文章就介紹到這了,更多相關(guān)SpringBoot攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中統(tǒng)一返回前端格式及統(tǒng)一結(jié)果處理返回詳解

    java中統(tǒng)一返回前端格式及統(tǒng)一結(jié)果處理返回詳解

    這篇文章主要介紹了統(tǒng)一結(jié)果處理的重要性,以及如何在SpringBoot項(xiàng)目中定義和使用統(tǒng)一結(jié)果返回類,通過(guò)構(gòu)造器私有化和靜態(tài)方法ok、error,提供了成功和失敗的統(tǒng)一響應(yīng)格式,需要的朋友可以參考下
    2025-02-02
  • Java SpringBoot實(shí)現(xiàn)帶界面的代碼生成器詳解

    Java SpringBoot實(shí)現(xiàn)帶界面的代碼生成器詳解

    這篇文章主要介紹了Java SpringBoot如何實(shí)現(xiàn)帶界面的代碼生成器,幫助大家更好的理解和使用Java SpringBoot編程語(yǔ)言,感興趣的朋友可以了解下
    2021-09-09
  • 簡(jiǎn)介Java程序的Shell腳本包裝

    簡(jiǎn)介Java程序的Shell腳本包裝

    這篇文章主要介紹了簡(jiǎn)介Java程序的Shell腳本包裝,將Java運(yùn)用于腳本程序當(dāng)中,有時(shí)或許是個(gè)不錯(cuò)的主意~需要的朋友可以參考下
    2015-07-07
  • Java SpringBoot快速集成SpringBootAdmin管控臺(tái)監(jiān)控服務(wù)詳解

    Java SpringBoot快速集成SpringBootAdmin管控臺(tái)監(jiān)控服務(wù)詳解

    這篇文章主要介紹了如何基于springboot-admin管控臺(tái)監(jiān)控服務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Java中方法的重寫與成員變量的隱藏

    Java中方法的重寫與成員變量的隱藏

    這篇文章討論了Java面向?qū)ο蟾拍钪幸粋€(gè)基本的概念–Field Hiding(隱藏成員變量),文中給大家介紹了java中的重寫知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-11-11
  • Java實(shí)現(xiàn)5種限流算法及7種限流方式

    Java實(shí)現(xiàn)5種限流算法及7種限流方式

    本文主要介紹了Java實(shí)現(xiàn)5種限流算法及7種限流方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 深入淺出理解Java泛型的使用

    深入淺出理解Java泛型的使用

    這篇文章主要介紹了深入淺出理解Java泛型的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • mybatis的動(dòng)態(tài)SQL和模糊查詢實(shí)例詳解

    mybatis的動(dòng)態(tài)SQL和模糊查詢實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于mybatis的動(dòng)態(tài)SQL和模糊查詢的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 詳解SpringBoot?Start組件開發(fā)之記錄接口日志信息

    詳解SpringBoot?Start組件開發(fā)之記錄接口日志信息

    這篇文章主要為大家介紹了SpringBoot-Start組件開發(fā)之記錄接口日志信息詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 定時(shí)任務(wù)注解@Scheduled不生效問(wèn)題及解決

    定時(shí)任務(wù)注解@Scheduled不生效問(wèn)題及解決

    這篇文章主要介紹了定時(shí)任務(wù)注解@Scheduled不生效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評(píng)論

成武县| 临澧县| 建德市| 盐池县| 土默特左旗| 巴塘县| 政和县| 隆安县| 浦北县| 南乐县| 扬中市| 浑源县| 红桥区| 汽车| 拉孜县| 佛学| 海淀区| 伊通| 庆阳市| 遂溪县| 吉水县| 新郑市| 宜城市| 文成县| 治多县| 新津县| 安阳县| 西藏| 百色市| 连南| 绥德县| 玉林市| 乌鲁木齐市| 石柱| 洞头县| 上思县| 青河县| 东乌珠穆沁旗| 灌云县| 西华县| 乐至县|