Spring Boot項(xiàng)目中定制攔截器的方法詳解
這篇文章主要介紹了Spring Boot項(xiàng)目中定制攔截器的方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
Servlet 過濾器屬于Servlet API,和Spring關(guān)系不大。除了使用過濾器包裝web請(qǐng)求,Spring MVC還提供HandlerInterceptor(攔截器)工具。根據(jù)文檔,HandlerInterceptor的功能跟過濾器類似,但攔截器提供更精細(xì)的控制能力:在request被響應(yīng)之前、request被響應(yīng)之后、視圖渲染之前以及request全部結(jié)束之后。我們不能通過攔截器修改request內(nèi)容,但是可以通過拋出異常(或者返回false)來暫停request的執(zhí)行。
Spring MVC中常用的攔截器有:LocaleChangeInterceptor(用于國際化配置)和ThemeChangeInterceptor。我們也可以增加自己定義的攔截器,可以參考這篇文章中提供的demo
實(shí)戰(zhàn)
添加攔截器不僅是在WebConfiguration中定義bean,Spring Boot提供了基礎(chǔ)類WebMvcConfigurerAdapter,我們項(xiàng)目中的WebConfiguration類需要繼承這個(gè)類。
繼承WebMvcConfigurerAdapter;
為LocaleChangeInterceptor添加@Bean定義,這僅僅是定義了一個(gè)interceptor spring bean,但是Spring boot不會(huì)自動(dòng)將它加入到調(diào)用鏈中。
攔截器需要手動(dòng)加入調(diào)用鏈。
修改后完整的WebConfiguration代碼如下:
package com.test.bookpub; import org.apache.catalina.filters.RemoteIpFilter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; @Configuration public class WebConfiguration extends WebMvcConfigurerAdapter { @Bean public RemoteIpFilter remoteIpFilter() { return new RemoteIpFilter(); } @Bean public LocaleChangeInterceptor localeChangeInterceptor() { return new LocaleChangeInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry { registry.addInterceptor(localeChangeInterceptor()); } }
使用mvn spring-boot:run
運(yùn)行程序,然后通過httpie訪問http://localhost:8080/books?locale=foo
,在終端看到如下錯(cuò)誤信息。
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.UnsupportedOperationException: Cannot change HTTP accept header - use a different locale resolution strategy] with root cause
PS:這里發(fā)生錯(cuò)誤并不是因?yàn)槲覀冚斎氲膌ocale是錯(cuò)誤的,而是因?yàn)槟J(rèn)的locale修改策略不允許來自瀏覽器的請(qǐng)求修改。發(fā)生這樣的錯(cuò)誤說明我們之前定義的攔截器起作用了。
分析
在我們的示例項(xiàng)目中,覆蓋并重寫了addInterceptors(InterceptorRegistory registory)方法,這是典型的回調(diào)函數(shù)——利用該函數(shù)的參數(shù)registry來添加自定義的攔截器。
在Spring Boot的自動(dòng)配置階段,Spring Boot會(huì)掃描所有WebMvcConfigurer的實(shí)例,并順序調(diào)用其中的回調(diào)函數(shù),這表示:如果我們想對(duì)配置信息做邏輯上的隔離,可以在Spring Boot項(xiàng)目中定義多個(gè)WebMvcConfigurer的實(shí)例。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot部署在tomcat容器中運(yùn)行的部署方法
這篇文章主要介紹了SpringBoot部署在tomcat容器中運(yùn)行的部署方法,需要的朋友可以參考下2018-10-10詳解Java如何實(shí)現(xiàn)在PDF中插入,替換或刪除圖像
圖文并茂的內(nèi)容往往讓人看起來更加舒服,如果只是文字內(nèi)容的累加,往往會(huì)使讀者產(chǎn)生視覺疲勞。搭配精美的文章配圖則會(huì)使文章內(nèi)容更加豐富。那我們要如何在PDF中插入、替換或刪除圖像呢?別擔(dān)心,今天為大家介紹一種高效便捷的方法2023-01-01Java中?SLF4J和Logback和Log4j和Logging的區(qū)別與聯(lián)系
這篇文章主要介紹了Java中?SLF4J和Logback和Log4j和Logging的區(qū)別與聯(lián)系,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考幾種,感興趣的小伙伴可以參考一下2022-09-09Java實(shí)現(xiàn)實(shí)時(shí)監(jiān)控目錄下文件變化的方法
今天小編就為大家分享一篇關(guān)于Java實(shí)現(xiàn)實(shí)時(shí)監(jiān)控目錄下文件變化的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03基于springboot創(chuàng)建mybatis的完整步驟
MyBatis是一款優(yōu)秀的數(shù)據(jù)庫持久層框架,相比Hibernate我更喜歡使用MyBatis,看的到SQL還是讓人更安心點(diǎn),這篇文章主要給大家介紹了關(guān)于基于springboot創(chuàng)建mybatis的完整步驟,需要的朋友可以參考下2024-03-03java中實(shí)現(xiàn)控制臺(tái)打印sql語句方式
這篇文章主要介紹了java中實(shí)現(xiàn)控制臺(tái)打印sql語句方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06springboot vue完成發(fā)送接口請(qǐng)求顯示響應(yīng)頭信息
這篇文章主要為大家介紹了springboot+vue完成發(fā)送接口請(qǐng)求顯示響應(yīng)頭信息,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05