RestClient?通過(guò)攔截器實(shí)現(xiàn)請(qǐng)求加密的示例
今天我發(fā)現(xiàn)了一個(gè)關(guān)于請(qǐng)求加密的有效寫(xiě)法,特此分享給大家。如果你的加密需求是將請(qǐng)求參數(shù)也包含在內(nèi),通常情況下,我們需要先將請(qǐng)求體轉(zhuǎn)換成 JSON 格式或其他對(duì)象類型,再使用字符串的形式進(jìn)行加密操作。以下是偽代碼示例,展示了這一過(guò)程的實(shí)現(xiàn)方法:
String payloadString = ModelOptionsUtils.toJsonString(payload); String hashedRequestPayload = sha256Hex(payloadString); //將hashedRequestPayload封裝到j(luò)sonContentHeaders中,并添加到請(qǐng)求頭中 ResponseEntity<String> retrieve = this.restClient.post().uri("/").headers(headers -> { headers.addAll(jsonContentHeaders); }).body(chatRequest).retrieve().toEntity(String.class);
這種方法看起來(lái)有些繁瑣,而且如果在轉(zhuǎn)換過(guò)程中與實(shí)際請(qǐng)求的結(jié)構(gòu)不一致,可能會(huì)導(dǎo)致加密失敗。關(guān)鍵問(wèn)題在于 ModelOptionsUtils.toJsonString(payload);
這一過(guò)程,它與 restClient
中對(duì)象轉(zhuǎn)化的方式并不完全一致。如果在轉(zhuǎn)化時(shí)出現(xiàn)任何問(wèn)題,我們不僅難以復(fù)現(xiàn)錯(cuò)誤,還可能會(huì)面臨很難排查的問(wèn)題。理想的情況是,如果我們能夠準(zhǔn)確了解請(qǐng)求體在加密前最終的轉(zhuǎn)換結(jié)果,那將大大簡(jiǎn)化排查過(guò)程并提高加密的可靠性。
所以今天我們就以攔截器的形式加密一下,保證與真實(shí)上傳的請(qǐng)求體保持一致。
攔截器
今天簡(jiǎn)單介紹一下請(qǐng)求類 RestClient
。其實(shí),它和我們之前使用的 HttpUtils
功能上是類似的,但相較于 HttpUtils
,RestClient
在可操作性和靈活性方面做了很多優(yōu)化,能夠提供更加豐富的功能和更高效的操作體驗(yàn)。特別是今天我們要重點(diǎn)介紹的攔截器功能,它可以讓我們更加便捷地處理請(qǐng)求和響應(yīng)的相關(guān)邏輯。接下來(lái),我們就通過(guò)一個(gè)示例來(lái)詳細(xì)了解這個(gè)過(guò)濾器的使用。
ApiAuthHttpRequestInterceptor apiAuthHttpRequestInterceptor = new ApiAuthHttpRequestInterceptor(); this.restClient = RestClient.Builder.baseUrl(baseUrl) .defaultHeaders(jsonContentHeaders) .defaultStatusHandler(responseErrorHandler) .requestInterceptor(apiAuthHttpRequestInterceptor) .build();
我們?cè)诰唧w看下ApiAuthHttpRequestInterceptor類是如何實(shí)現(xiàn)的。
public class ApiAuthHttpRequestInterceptor implements ClientHttpRequestInterceptor { @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { String hashedRequestPayload = sha256Hex(payloadString); //將hashedRequestPayload封裝到j(luò)sonContentHeaders中,并添加到請(qǐng)求頭中 request.getHeaders().putAll(httpHeadersConsumer); ClientHttpResponse response = execution.execute(request, body); return response; } }
這一步的偽代碼非常簡(jiǎn)潔明了,主要是因?yàn)槲覀兡軌蛑苯荧@取到需要發(fā)送的請(qǐng)求體,因此無(wú)需再進(jìn)行復(fù)雜的對(duì)象轉(zhuǎn)換或序列化處理,避免了中間環(huán)節(jié)可能帶來(lái)的不必要錯(cuò)誤或數(shù)據(jù)變動(dòng)。
內(nèi)部原理
這里面的原理也很簡(jiǎn)單,核心思想就是對(duì)我們所注入的每個(gè)攔截器進(jìn)行逐一遍歷,并按照預(yù)定的邏輯依次執(zhí)行我們重寫(xiě)的相關(guān)方法。通過(guò)這樣的方式,可以在不改變?cè)羞壿嫷幕A(chǔ)上,實(shí)現(xiàn)靈活的擴(kuò)展與控制。具體的流程和實(shí)現(xiàn)細(xì)節(jié)如下圖所示:
這里就是一個(gè)遞歸的過(guò)程,全部完成之后就可以正常去請(qǐng)求了。
總結(jié)
通過(guò)今天的分享,我們探討了如何在請(qǐng)求中實(shí)現(xiàn)加密操作,并通過(guò)攔截器優(yōu)化了加密過(guò)程。在傳統(tǒng)方法中,依賴對(duì)象轉(zhuǎn)換和序列化處理,容易導(dǎo)致加密不一致或難以調(diào)試的問(wèn)題。通過(guò)引入攔截器,我們能夠直接操作請(qǐng)求體,避免了不必要的轉(zhuǎn)換步驟,確保加密過(guò)程與請(qǐng)求體完全一致,從而提高了加密的可靠性和調(diào)試的便捷性。希望這種方法對(duì)大家在加密需求的實(shí)現(xiàn)上有所幫助!
到此這篇關(guān)于RestClient 通過(guò)攔截器實(shí)現(xiàn)請(qǐng)求加密的示例的文章就介紹到這了,更多相關(guān)RestClient 請(qǐng)求加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Java實(shí)現(xiàn)查找并移除字符串中的Emoji
Emoji 實(shí)際上是 UTF-8 (Unicode) 字符集上的特殊字符,這篇文章主要介紹了如何使用Java實(shí)現(xiàn)查找并移除字符串中的Emoji,感興趣的可以了解下2024-03-03mybatis plus代碼生成工具的實(shí)現(xiàn)代碼
這篇文章主要介紹了mybatis plus代碼生成工具的實(shí)現(xiàn)代碼,需要的朋友可以參考下2021-04-04Spring?Boot?3.1中整合Spring?Security和Keycloak的方法
本文介紹在最新的SpringBoot3.1版本之下,如何將Keycloak和Spring?Security一起跑起來(lái),文中結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-06-06Maven項(xiàng)目執(zhí)行生命周期相關(guān)操作時(shí)出現(xiàn)錯(cuò)誤:does not match a
當(dāng)pom文件中的gav標(biāo)簽格式錯(cuò)誤,如出現(xiàn)中文或空格,會(huì)導(dǎo)致與有效的id模式不匹配錯(cuò)誤,gav標(biāo)簽應(yīng)僅包含數(shù)字、字母和下劃線,解決方法是修改標(biāo)簽中的中文為英文,刪除多余空格,并刷新pom文件,例如,將中文"測(cè)試"改為英文"test"2024-09-09Java中的for循環(huán)結(jié)構(gòu)及實(shí)例
這篇文章主要介紹了Java中的for循環(huán)結(jié)構(gòu)及實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01IDEA下SpringBoot指定環(huán)境、配置文件啟動(dòng)操作過(guò)程
這篇文章主要介紹了IDEA下SpringBoot指定環(huán)境、配置文件啟動(dòng)過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08新版本Spring中l(wèi)ombok失效的問(wèn)題解決
Lombok是一個(gè)Java庫(kù),通過(guò)添加注解簡(jiǎn)化代碼編寫(xiě),本文主要介紹了新版本Spring中l(wèi)ombok失效的問(wèn)題解決,感興趣的可以了解一下2025-01-01