Spring Boot專案中如何定製攔截器
本文首發於個人網站:
Servlet 過濾器屬於Servlet API,和Spring關係不大。除了使用過濾器包裝web請求,Spring MVC還提供*HandlerInterceptor(攔截器)*工具。根據文件,HandlerInterceptor的功能跟過濾器類似,但攔截器提供更精細的控制能力:在request被響應之前、request被響應之後、檢視渲染之前以及request全部結束之後。我們不能透過攔截器修改request內容,但是可以透過丟擲異常(或者返回false)來暫停request的執行。
Spring MVC中常用的攔截器有:LocaleChangeInterceptor(用於國際化配置)和ThemeChangeInterceptor。我們也可以增加自己定義的攔截器,可以參考這篇文章中提供的
實戰
新增攔截器不僅是在WebConfiguration中定義bean,Spring Boot提供了基礎類WebMvcConfigurerAdapter,我們專案中的WebConfiguration類需要繼承這個類。
- 繼承WebMvcConfigurerAdapter;
- 為LocaleChangeInterceptor新增@Bean定義,這僅僅是定義了一個interceptor spring bean,但是Spring boot不會自動將它加入到呼叫鏈中。
- 攔截器需要手動加入呼叫鏈。
修改後完整的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
執行程式,然後透過httpie訪問,在終端看到如下錯誤資訊。
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:這裡發生錯誤並不是因為我們輸入的locale是錯誤的,而是因為預設的locale修改策略不允許來自瀏覽器的請求修改。發生這樣的錯誤說明我們之前定義的攔截器起作用了。
分析
在我們的示例專案中,覆蓋並重寫了*addInterceptors(InterceptorRegistory registory)*方法,這是典型的回撥函式——利用該函式的引數registry來新增自定義的攔截器。
在Spring Boot的自動配置階段,Spring Boot會掃描所有WebMvcConfigurer的例項,並順序呼叫其中的回撥函式,這表示:如果我們想對配置資訊做邏輯上的隔離,可以在Spring Boot專案中定義多個WebMvcConfigurer的例項。
Spring Boot 1.x系列
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3349/viewspace-2824025/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- spring boot 攔截器Spring Boot
- Spring Boot中攔截器的使用Spring Boot
- Spring Boot新增攔截器Spring Boot
- Spring Boot 第六彈,攔截器如何配置,看這兒~Spring Boot
- spring攔截器Spring
- Spring MVC 中的攔截器的使用“攔截器基本配置” 和 “攔截器高階配置”SpringMVC
- Spring Boot第七彈,別再問我攔截器如何配置了!!!Spring Boot
- spring boot 新增自定義監聽器、過濾器、攔截器Spring Boot過濾器
- spring中的過濾器與攔截器Spring過濾器
- SpringMVC攔截器,設定不攔截的URLSpringMVC
- 如何定製 Spring Boot 的 Banner?Spring Boot
- spring mvc攔截器,spring攔截器以及AOP切面的區別和原始碼SpringMVC原始碼
- Spring 過濾器和攔截器Spring過濾器
- 在spring boot專案(maven)中引入其他 spring boot專案Spring BootMaven
- Spring Boot定製啟動圖案Spring Boot
- spring mvc 攔截器的使用SpringMVC
- Spring AOP 在 XML檔案中實現 AspectJ 攔截SpringXML
- Vue + Spring Boot 專案實戰(十四):使用者認證方案與完善的訪問攔截VueSpring Boot
- SpringMVC中的攔截器SpringMVC
- grpc中的攔截器RPC
- 如何執行Spring Boot專案Spring Boot
- SpringBoot攔截器中獲取註解、攔截器中注入ServiceSpring Boot
- 談談 Spring 的過濾器和攔截器Spring過濾器
- mpvue專案中基於flyio實現的可更新cookie的攔截器VueCookie
- Intellij IDEA 中 的spring boot 專案使用了spring-boot-devtools要做的兩個設定IntelliJIdeaSpring Bootdev
- Spring 常用的三種攔截器詳解Spring
- 如何增強grpc的攔截器RPC
- SpringMVC攔截器SpringMVC
- axios 攔截器iOS
- axios攔截器iOS
- sql攔截器SQL
- Mybatis 攔截器MyBatis
- MyBatis攔截器MyBatis
- SSM專案使用攔截器實現登入驗證功能SSM
- Spring Boot2中如何優雅地個性化定製JacksonSpring Boot
- Spring Boot使用過濾器和攔截器分別實現REST介面簡易安全認證Spring Boot過濾器REST
- Spring Boot專案建立Spring Boot
- Spring AOP 日誌攔截器的事務管理Spring