微服務中引入公共攔截器

????????本文使用的微服務版本為springcloudAlbaba :2021.0.4.0

????????微服務工程,一般公共的東西都放入一個工程,別的微服務都會引入這個工程,比如common-service,那么就可以在這個工程編寫一個攔截器:,比如:

public class UserInfoInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//從請求頭中獲取用戶信息String header = request.getHeader("user-info");if(StrUtil.isNotBlank(header)){//這里UserContext的user是個ThreadLocalUserContext.setUser(Long.valueOf(header));}return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {UserContext.removeUser();}
}

????????這里是做個用戶信息獲取的攔截器,從請求頭中獲取用戶信息,然后塞入ThreadLocal中,供后續業務使用。

????????定義完了,為了使它生效,編譯一個配置類:

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new UserInfoInterceptor());}
}

????????然后利用springboot自動裝配的原理,在spring.factroies中添加MvcConfig的全路徑,

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.*.common.config.MvcConfig

????????這里*用你實際的就好,別真的寫*。

????????這樣所有引入common-service依賴的微服務都添加了這個攔截器。

????????但是注意如果某個微服務啟動報錯,可能是你的某這個微服務沒有引入springmvc的依賴,比如網關微服務,網關不需要springmvc的依賴,也不需要這個攔截器,

? ? ? ? 我們同樣利用springboot自動裝配ConditionalOnClass注解的特性來讓網關不引入這個攔截器。只需要加上一段@ConditionalOnClass(DispatcherServlet.class)即可

@Configuration
@ConditionalOnClass(DispatcherServlet.class)
public class MvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new UserInfoInterceptor());}
}
????????DispatcherServlet是springmvc的核心類,使用ConditionalOnClass,即判斷當前有沒有引入springmvc的依賴來判斷是否引入MvcConfig 這個配置類,網關沒有springmvc的依賴,這樣這個配置類就不會生效。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82208.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82208.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82208.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux SLES 系統的/var/log/下的常見文件及其作用

在 SUSE Linux Enterprise Server(SLES) 系統中,/var/log/ 目錄是系統日志的集中地,存儲了各種服務、內核、系統消息的日志。以下是一些在 /var/log/ 下常見的日志文件及其功能: 📂 常見日志文件及功能 文…

oracle goldengate同步SQL server到SQL server的實時數據同步

參考文檔 https://docs.oracle.com/en/middleware/goldengate/core/19.1/oggmp/oracle-goldengate-classic-sql-server.html#GUID-948C5BEE-E7A0-4CE2-BE09-F83145677D18 https://docs.oracle.com/en/middleware/goldengate/core/21.3/ggcab/other-programs-and-settings-sql-…

語音轉文字工具

平時工作和學習比較忙,可能沒時間聽講座,只能看回放,回訪也很長,這時,我們可以借助語言轉文字,通過閱讀文字快速了解講座的重點,今天給大家分享一個本人經常用的語言轉文字工具,改工…

硬件實時時鐘(RTC)

硬件實時時鐘(RTC)詳解 硬件實時時鐘(Real-Time Clock,RTC)是計算機主板上的一個獨立計時芯片,用于在系統關機后持續記錄時間。它不依賴操作系統,由紐扣電池(如CR2032)供…

pycharm debug的時候無法debug到指定的位置就停住不動了

報錯大致是這樣的,但是直接run沒有問題,debug就停住不動了 Traceback (most recent call last): File "/home/mapengsen/.pycharm_helpers/pydev/_pydevd_bundle/pydevd_comm.py", line 467, in start_client s.connect((host, port)) Timeou…

Python6.1打卡(day33)

DAY 33 MLP神經網絡的訓練 知識點回顧: 1.PyTorch和cuda的安裝 2.查看顯卡信息的命令行命令(cmd中使用) 3.cuda的檢查 4.簡單神經網絡的流程 1.數據預處理(歸一化、轉換成張量) 2.模型的定義 …

NodeJS全棧開發面試題講解——P11消息隊列(MQ)

? 11.1 為什么要用消息隊列?在哪些場景下最適合? ? 作用: 削峰填谷:緩解高并發壓力,異步處理任務(如秒殺下單 → MQ → 異步扣庫存) 解耦服務:上下游解耦(如下單服務…

mysql執行sql語句報錯事務鎖住

報錯情況 1205 - Lock wait timeout exceeded; try restarting transaction先找出長時間運行的事務 SELECT * FROM information_schema.INNODB_TRX ORDER BY trx_started ASC;終止長時間運行的事務 KILL [PROCESS_ID];

C#集合循環刪除某些行

你想要在遍歷集合(例如List)的同時刪除某些元素時,直接在循環中刪除元素可能會導致問題,因為這可能會改變集合的大小和導致索引問題; 可以用for循環的倒序來刪除; 如果要刪除滿足特定條件的所有元素&…

裂縫儀在線監測裝置:工程安全領域的“實時守衛者”

在基礎設施運維領域,裂縫擴展是威脅建筑結構安全的核心隱患之一。傳統人工巡檢方式存在效率低、時效性差、數據主觀性強等局限,而裂縫儀在線監測裝置通過技術迭代,實現了對結構裂縫的自動化、持續性追蹤,為工程安全評估提供科學依…

Multisim14使用教程詳盡版--(2025最新版)

一、Multisim14前言 1.1、主流電路仿真軟件 1. Multisim:NI開發的SPICE標準仿真工具,支持模擬/數字電路混合仿真,內置豐富的元件庫和虛擬儀器(示波器、頻譜儀等),適合教學和競賽設計。官網:艾默生旗下測試和測量系統 - NI。 2. LTspice XVII:ADI旗下免費高性能SPICE仿…

深度學習篇---人臉識別中的face-recognition庫和深度學習

深度學習方法和使用 Python 的face_recognition庫進行人臉識別在技術原理、實現方式和應用場景上有顯著區別,以下從多個維度對比分析: 一、技術原理 1. 深度學習方法 核心邏輯:基于神經網絡(如卷積神經網絡 CNN)構建…

Go語言中的數據類型轉換

Go 語言中只有強制類型轉換,沒有隱式類型轉換。 1. 數值類型之間的相互轉換 1.1. 整型和整型之間的轉換 package main import "fmt"func main() {var a int8 20var b int16 40fmt.Println(int16(a) b)// 60 }1.2. 浮點型和浮點型之間的轉換 packag…

行為型:中介者模式

目錄 1、核心思想 2、實現方式 2.1 模式結構 2.2 實現案例 3、優缺點分析 4、適用場景 5、注意事項 1、核心思想 目的:通過引入一個中介對象來封裝一組對象之間的交互,解決對象間過度耦合、頻繁交互的問題。不管是對象引用維護還是消息的轉發&am…

node_modules\node-sass: Command failed.報錯了

node_modules\node-sass: Command failed.錯誤解決 第一步:刪掉:目錄中劃紅線的配置文件 刪掉項目中的node_modules第二步:用admin權限執行,重新配置npm和yarn npm config set registry https://registry.npm.taobao.org --global npm con…

STM32 ADC工作原理與配置詳解

文章目錄 ADCADC簡介逐次逼近型ADCADC框圖ADC框圖的工作流程(以規則組為例)1. 輸入通道選擇與信號接入2. 觸發轉換:軟件或硬件觸發3. 采樣保持與量化編碼4. 轉換結果處理與存儲5. 狀態標志與中斷6. 參考電壓與時鐘驅動7. 輔助功能&#xff1a…

1、Pytorch介紹與安裝

1、Pytorch介紹 PyTorch 是由 Facebook AI Research (FAIR) 團隊開發并維護的一款開源深度學習框架,于 2016 年首次發布。它因其直觀的設計、卓越的靈活性以及強大的動態計算圖功能,迅速在學術界和工業界獲得了廣泛認可,成為當前深度學習研究…

RedisTemplate查詢不到redis中的數據問題(序列化)

RedisTemplate查詢不到redis中的數據問題(序列化) 一.問題描述 存入Redis中的值取出來卻為null,問題根本原因就是RedisTemplate和StringRedisTemplate的序列化問題、代碼示例: SpringBootTest class Redis02SpringbootApplicationTests {Autowiredprivate RedisTe…

【Net】TCP粘包與半包

文章目錄 TCP粘包與半包1 背景2 粘包(packet stick)3 半包(packet split)4 為什么會出現粘包/半包?5 如何解決?6 示例7 總結 TCP粘包與半包 在網絡編程中,粘包和半包問題是常見的 TCP 協議特有…

Leetcode 3566. Partition Array into Two Equal Product Subsets

Leetcode 3566. Partition Array into Two Equal Product Subsets 1. 解題思路2. 代碼實現 題目鏈接:3566. Partition Array into Two Equal Product Subsets 1. 解題思路 這一題我的實現還是比較暴力的,首先顯而易見的,若要滿足題目要求&…