欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

RestTemplate發(fā)送請求時Cookie的影響及注意事項說明

 更新時間:2023年07月06日 10:54:29   作者:畢小寶  
這篇文章主要介紹了RestTemplate發(fā)送請求時Cookie的影響及注意事項說明,具有很好的參考價值,希望對大家有所幫助。

背景

一個基于 SpringCloud 的多服務(wù)項目中,服務(wù)間調(diào)用通過 Spring 的 RestTemplate 實現(xiàn),后臺模塊 A 有一個定期清理無效業(yè)務(wù)數(shù)據(jù)的任務(wù),它調(diào)用 Web 服務(wù) B 的 API 時,竟然一直出現(xiàn) Token 已過期問題。

技術(shù)背景

  • Web 服務(wù)權(quán)限認(rèn)證使用 Token ,登錄校驗成功后,刷新 Token 并調(diào)用 response.addCookie 返回給調(diào)用方——瀏覽器或者內(nèi)部服務(wù)。
  • Web 服務(wù)的攔截器,它提取 Token 的順序是:請求參數(shù)、Cookie、Header,然后驗證 Token 的有效性。校驗通過,刷新 Token 到響應(yīng)對象的 Cookie 中。
  • Token 有效期限 30 分鐘。
  • 后臺定時任務(wù)模塊 A 每小時調(diào)用一次模塊 B 的的 API 。

對于 Web 服務(wù)模塊 B 來說,請求來源有用戶瀏覽器和內(nèi)部服務(wù) A ,Token 校驗通過后會刷新并設(shè)置響應(yīng)對象的 Cookie 中,而 Cookie 又會在下次請求時發(fā)送給服務(wù)器。

各服務(wù)穩(wěn)定運行后,定時任務(wù) A 調(diào)用服務(wù) B 的 API,從來都沒有成功過。

后臺服務(wù)調(diào)用時 Cookie 失效問題

問題描述

后臺服務(wù) A 在調(diào)用 B 的 某API 時,雖然會生成新 Token 信息并設(shè)置到頭域,但是除了應(yīng)用啟動時成功調(diào)用了一次,其他周期的調(diào)用都出現(xiàn)了 Token 已過期問題。

問題分析

分析整個認(rèn)證過程,發(fā)現(xiàn)在 Web 的攔截器中,如果檢測到了內(nèi)部服務(wù)調(diào)用,會刷新 Token 信息并返回給 RestTemplate 對象,而且攔截器提取 Token 的順序是:請求參數(shù)、Cookie、Header。

// 請求參數(shù)
String token = request.getParameter("t");
// Cookie
if (StringUtils.isEmpty(token)) {
? ? Cookie[] cs = request.getCookies();
? ? if (cs != null) {
? ? ? ? for (Cookie c : cs) {
? ? ? ? ? ? if ("t".equals(c.getName())) {
? ? ? ? ? ? ? ? token = c.getValue();
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
?//Header
if (StringUtils.isEmpty(token)) {
? ? token = request.getHeader("t");
}

問題癥結(jié)

后臺模塊 A 一小時執(zhí)行一次,每次調(diào)用使用 Spring 托管的 RestTemplate 單例對象發(fā)送請求給 B 時,它包含了上次請求收到的 Cookie 信息。

雖然同時生成了 Token 的頭域信息,但是在 Web 端優(yōu)先校驗了 Cookie ,因此認(rèn)證結(jié)果始終是無效 Token ,請求被拒絕。

啟示錄

我從互聯(lián)網(wǎng)上得到的最好的經(jīng)驗之一,就是永遠(yuǎn)不要復(fù)制和粘貼不是自己編寫的代碼。

如果你一定要復(fù)制,那就照著它逐字輸入,逼著自己思考,這些代碼實際上是什么意思。

這是昨天看科技周刊印象深刻的一句話,本文的問題雖然不是復(fù)制粘貼導(dǎo)致的,但它別人的代碼、別人的思想,我沒有深刻分析過。

當(dāng)我臨時救火被分派解決這個問題時,簡單看了下代碼分析如下:

  • 后端服務(wù)設(shè)置 Token 到了頭域
  • 而 Web 模塊只從 Cookie 和請求參數(shù)中獲取 Token ,沒有從 Header 中獲取

想當(dāng)然地以為,只要加上從 Header 中獲取就好了,而且陰差陽錯的加在了 Cookie 獲取的后面,所以問題還是沒有解決。

反復(fù)加日志,打印各個信息的 Token ,發(fā)現(xiàn)解析時用的 Token 跟頭域不一樣, Token 失效時間也很規(guī)律,就是上次定時任務(wù)的調(diào)用時間。突然意識到了,Web 服務(wù)用的 Token 跟我想的不一樣,誰把 Token 給改了?

答案是 Cookie,RestTemplate 竟然在發(fā)送請求時把上次的 Cookie 給帶上了。30分鐘的有效期,下一輪定時任務(wù)執(zhí)行時,早就是失效了啊。

RestTemplate 注意事項

用 RestTemplate 進(jìn)行服務(wù)調(diào)用時,最好清掉 Cookie 信息,

一來避免本文出現(xiàn)的情況;

二來,它作為Spring 托管的單例,如果訪問的是不同系統(tǒng)的 API ,勢必會出現(xiàn) Cookie 混淆、失效的問題!

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot集成mybatisplus的詳細(xì)步驟

    springboot集成mybatisplus的詳細(xì)步驟

    MyBatis-Plus (opens new window)(簡稱 MP)是一個 MyBatis (opens new window)的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,這篇文章主要介紹了springboot四步集成mybatisplus,需要的朋友可以參考下
    2022-10-10
  • SpringBoot遠(yuǎn)程訪問redis服務(wù)器問題剖析

    SpringBoot遠(yuǎn)程訪問redis服務(wù)器問題剖析

    使用了SpringBoot的項目,在遠(yuǎn)程連接Redis服務(wù)器時,會遇倒一些小問題,下面通過本文給大家全面解析SpringBoot遠(yuǎn)程訪問redis服務(wù)器問題,需要的朋友參考下吧
    2017-04-04
  • Java 通過 二三法 巧解前端數(shù)據(jù)顯示

    Java 通過 二三法 巧解前端數(shù)據(jù)顯示

    實踐來源于理論,做開發(fā)前肯定要先了解相關(guān)的規(guī)則和原理,看到標(biāo)題或許你會好奇什么是二三法。本篇文章帶你深入了解,需要的朋友可以參考下
    2021-10-10
  • Java Socket實現(xiàn)聊天室附1500行源代碼

    Java Socket實現(xiàn)聊天室附1500行源代碼

    Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。本篇文章手把手帶你通過Java Socket來實現(xiàn)自己的聊天室,大家可以在過程中查缺補(bǔ)漏,溫故而知新
    2021-10-10
  • spring boot 配置freemarker及如何使用freemarker渲染頁面

    spring boot 配置freemarker及如何使用freemarker渲染頁面

    springboot中自帶的頁面渲染工具為thymeleaf 還有freemarker這兩種模板引擎,本文重點給大家介紹spring boot 配置freemarker及如何使用freemarker渲染頁面,感興趣的朋友一起看看吧
    2023-10-10
  • 深入淺出探究Java多態(tài)的實現(xiàn)和應(yīng)用

    深入淺出探究Java多態(tài)的實現(xiàn)和應(yīng)用

    多態(tài)是實現(xiàn)面向?qū)ο蟮能浖夹g(shù)中必不可少的一個內(nèi)容,所以這篇文章主要來和大家講解一下Java多態(tài)的實現(xiàn)和應(yīng)用,感興趣的小伙伴可以了解一下
    2023-07-07
  • Spring集成MyBatis?及Aop分頁的實現(xiàn)代碼

    Spring集成MyBatis?及Aop分頁的實現(xiàn)代碼

    這篇文章主要介紹了Spring集成MyBatis?及Aop分頁的實現(xiàn),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • SpringBoot?整合ChatGPT?API項目實戰(zhàn)教程

    SpringBoot?整合ChatGPT?API項目實戰(zhàn)教程

    這篇文章主要介紹了SpringBoot整合ChatGPT API項目實戰(zhàn)教程,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • spring使用validation參數(shù)及全局異常檢測方式

    spring使用validation參數(shù)及全局異常檢測方式

    本文主要介紹了Java的數(shù)據(jù)校驗規(guī)范validation-api,包括其定義的注解和HibernateValidator的實現(xiàn),還介紹了spring-boot-starter-validation的使用,可以讓開發(fā)者在SpringBoot應(yīng)用中簡化數(shù)據(jù)校驗的功能
    2025-02-02
  • openEuler?搭建java開發(fā)環(huán)境的詳細(xì)過程

    openEuler?搭建java開發(fā)環(huán)境的詳細(xì)過程

    這篇文章主要介紹了openEuler?搭建java開發(fā)環(huán)境,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06

最新評論