RestTemplate如何通過HTTP?Basic?Auth認(rèn)證示例說明
本文是精講RestTemplate第9篇,前篇的blog訪問地址如下:
RestTemplate在Spring或非Spring環(huán)境下使用精講
RestTemplate實(shí)現(xiàn)多種底層HTTP客戶端類庫的切換用法
RestTemplate發(fā)送HTTP GET請(qǐng)求使用方法詳解
RestTemplate發(fā)送HTTP POST請(qǐng)求使用方法詳解
RestTemplate的DELETE及PUT等請(qǐng)求方法使用精講
RestTemplate自定義請(qǐng)求失敗異常處理示例解析
RestTemplate請(qǐng)求失敗自動(dòng)重啟機(jī)制精講
服務(wù)提供方通常會(huì)通過一定的授權(quán)、鑒權(quán)認(rèn)證邏輯來保護(hù)API接口。其中比較簡單、容易實(shí)現(xiàn)的方式就是使用HTTP 的Basic Auth來實(shí)現(xiàn)接口訪問用戶的認(rèn)證。我們本節(jié)就來為大家介紹一下,在服務(wù)端加入Basic Auth認(rèn)證的情況下,該如何使用RestTemplate訪問服務(wù)端接口。
一、HttpBasic認(rèn)證原理說明

首先,HttpBasic模式要求傳輸?shù)挠脩裘艽a使用Base64模式進(jìn)行加密。如果用戶名是 "admin" ,密碼是“ admin”,則將字符串"admin:admin"使用Base64編碼算法加密。加密結(jié)果可能是:YWtaW46YWRtaW4=。
然后,在Http請(qǐng)求中使用authorization作為一個(gè)HTTP請(qǐng)求頭Header name,“Basic YWtaW46YWRtaW4=“作為Header的值,發(fā)送給服務(wù)端。(注意這里使用Basic+空格+加密串)
服務(wù)器在收到這樣的請(qǐng)求時(shí),到達(dá)BasicAuthenticationFilter過濾器,將提取“authorization”的Header值,并使用用于驗(yàn)證用戶身份的相同算法Base64進(jìn)行解碼。
解碼結(jié)果與登錄驗(yàn)證的用戶名密碼匹配,匹配成功則可以繼續(xù)過濾器后續(xù)的訪問。
二、HTTP Basic Auth服務(wù)端實(shí)現(xiàn)
如果你想自己搭建一個(gè)服務(wù)端,那么如何為Spring Boot 服務(wù)添加Basic Auth認(rèn)證?請(qǐng)參考我的另外一篇文章:《Spring Security系列之Http Basic Auth登錄認(rèn)證模式》 。
當(dāng)然我們也可以不用自己去搭建服務(wù)端,給大家介紹一個(gè)提供免費(fèi)在線的RESTful接口服務(wù)的網(wǎng)站:httpbin.com。這個(gè)網(wǎng)站為我們提供了Basic Auth認(rèn)證測(cè)試服務(wù)接口。如果我們只是為了學(xué)習(xí)RestTemplate,直接用這個(gè)網(wǎng)站提供的服務(wù)就可以了。

瀏覽器訪問地址:http://www.httpbin.org/#/Auth/get_basic_auth__user___passwd_
這個(gè)接口服務(wù)是通過OpenAPI(swagger)實(shí)現(xiàn)的,所以可以進(jìn)行在線的訪問測(cè)試。所以可以先通過頁面操作測(cè)試一下,再開始下面學(xué)習(xí)使用RestTemplate訪問服務(wù)端接口。
三、請(qǐng)求頭方式攜帶認(rèn)證信息
在HTTP請(qǐng)求頭中攜帶Basic Auth認(rèn)證的用戶名和密碼,具體實(shí)現(xiàn)參考下文代碼注釋:
@SpringBootTest
class BasicAuthTests {
@Resource
private RestTemplate restTemplate;
@Test
void testBasicAuth() {
//該url上攜帶用戶名密碼是httpbin網(wǎng)站測(cè)試接口的要求,
//真實(shí)的業(yè)務(wù)是不需要在url上體現(xiàn)basic auth用戶名密碼的
String url = "http://www.httpbin.org/basic-auth/admin/adminpwd";
//在請(qǐng)求頭信息中攜帶Basic認(rèn)證信息(這里才是實(shí)際Basic認(rèn)證傳遞用戶名密碼的方式)
HttpHeaders headers = new HttpHeaders();
headers.set("authorization",
"Basic " +
Base64.getEncoder()
.encodeToString("admin:adminpwd".getBytes()));
//發(fā)送請(qǐng)求
HttpEntity<String> ans = restTemplate
.exchange(url,
HttpMethod.GET, //GET請(qǐng)求
new HttpEntity<>(null, headers), //加入headers
String.class); //body響應(yīng)數(shù)據(jù)接收類型
System.out.println(ans);
}
}測(cè)試用例執(zhí)行成功,說明RestTemplate 正確的攜帶了Basic 認(rèn)證信息,得到正常的響應(yīng)結(jié)果:200。

四、攔截器方式攜帶認(rèn)證信息
第三小節(jié)中的代碼雖然實(shí)現(xiàn)了功能,但是不夠好。因?yàn)槊恳淮伟l(fā)送HTTP請(qǐng)求,我們都需要去組裝HttpHeaders 信息,這樣不好,造成大量的代碼冗余。那么有沒有一種方式可以實(shí)現(xiàn)可以一次性的為所有RestTemplate請(qǐng)求API添加Http Basic認(rèn)證信息呢?答案就是:在RestTemplate Bean初始化的時(shí)候加入攔截器,以攔截器的方式統(tǒng)一添加Basic認(rèn)證信息。
下面的代碼結(jié)合注釋去看,如果看不懂,需要去參考:
精講RestTemplate第2篇-多種底層HTTP客戶端類庫的切換
@Configuration
public class ContextConfig {
@Bean("OKHttp3")
public RestTemplate OKHttp3RestTemplate(){
RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());
//添加攔截器
restTemplate.getInterceptors().add(getCustomInterceptor());
return restTemplate;
}
//實(shí)現(xiàn)一個(gè)攔截器:使用攔截器為每一個(gè)HTTP請(qǐng)求添加Basic Auth認(rèn)證用戶名密碼信息
private ClientHttpRequestInterceptor getCustomInterceptor(){
ClientHttpRequestInterceptor interceptor = (httpRequest, bytes, execution) -> {
httpRequest.getHeaders().set("authorization",
"Basic " +
Base64.getEncoder()
.encodeToString("admin:adminpwd".getBytes()));
return execution.execute(httpRequest, bytes);
};
return interceptor;
}
//這段代碼是《第3節(jié)-底層HTTP客戶端實(shí)現(xiàn)切換》的內(nèi)容
private ClientHttpRequestFactory getClientHttpRequestFactory() {
int timeout = 100000;
OkHttp3ClientHttpRequestFactory clientHttpRequestFactory
= new OkHttp3ClientHttpRequestFactory();
clientHttpRequestFactory.setConnectTimeout(timeout);
return clientHttpRequestFactory;
}
}在RestTemplate Bean初始化的時(shí)候加入攔截器之后,第三小節(jié)中的代碼就可以省略HttpHeaders Basic Auth請(qǐng)求頭攜帶信息的組裝過程。發(fā)送請(qǐng)求,結(jié)果和第三小節(jié)中的效果是一樣的。
五、進(jìn)一步簡化
上面的方式使用了攔截器,但仍然是我們自己來封裝HTTP headers請(qǐng)求頭信息。進(jìn)一步的簡化方法就是,Spring RestTemplate 已經(jīng)為我們提供了封裝好的Basic Auth攔截器,我們直接使用就可以了,不需要我們自己去實(shí)現(xiàn)攔截器。

下面的方法是在RestTemplate Bean實(shí)例化的時(shí)候使用RestTemplateBuilder,自帶basicAuthentication。所以到這里攔截器也不需要了(實(shí)際底層代碼實(shí)現(xiàn)仍然是攔截器,只是api層面不需要指定攔截器了)。

發(fā)送請(qǐng)求,結(jié)果和第三小節(jié)中的效果是一樣的。
以上就是RestTemplate如何通過HTTP Basic Auth認(rèn)證示例說明的詳細(xì)內(nèi)容,更多關(guān)于RestTemplate認(rèn)證HTTP Basic Auth的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
關(guān)于java中可變長參數(shù)的定義及使用方法詳解
下面小編就為大家?guī)硪黄P(guān)于java中可變長參數(shù)的定義及使用方法詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
Java使用list集合remove需要注意的事項(xiàng)(使用示例)
List集合的一個(gè)特點(diǎn)是它其中的元素是有序的,也就是說元素的下標(biāo)是根據(jù)插入的順序來的,在刪除頭部或者中間的一個(gè)元素后,后面的元素下標(biāo)會(huì)往前移動(dòng),本文給大家介紹Java使用list集合remove需要注意的事項(xiàng),感興趣的朋友一起看看吧2022-01-01
Java 自定義Spring框架與Spring IoC相關(guān)接口分析
Spring框架是由于軟件開發(fā)的復(fù)雜性而創(chuàng)建的。Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務(wù)器端的開發(fā)2021-10-10
Spring?Boot?使用觀察者模式實(shí)現(xiàn)實(shí)時(shí)庫存管理的步驟
在現(xiàn)代軟件開發(fā)中,實(shí)時(shí)數(shù)據(jù)處理非常關(guān)鍵,本文提供了一個(gè)使用SpringBoot和觀察者模式開發(fā)實(shí)時(shí)庫存管理系統(tǒng)的詳細(xì)教程,步驟包括創(chuàng)建項(xiàng)目、定義實(shí)體類、實(shí)現(xiàn)觀察者模式、集成Spring框架、創(chuàng)建RESTful?API端點(diǎn)和測(cè)試應(yīng)用等,這將有助于開發(fā)者構(gòu)建能夠即時(shí)響應(yīng)庫存變化的系統(tǒng)2024-09-09
jar命令修改jar包中的application.yml配置文件
本文主要介紹了jar命令修改jar包中的application.yml配置文件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
javaweb實(shí)戰(zhàn)之商城項(xiàng)目開發(fā)(三)
這篇文章主要針對(duì)javaweb商城項(xiàng)目開發(fā)進(jìn)行實(shí)戰(zhàn)演習(xí),主要實(shí)現(xiàn)通用的BaseDao.java和使用resultMap映射關(guān)聯(lián)對(duì)象,感興趣的小伙伴們可以參考一下2016-02-02
Java詳解多線程協(xié)作作業(yè)之信號(hào)同步
信號(hào)量同步是指在不同線程之間,通過傳遞同步信號(hào)量來協(xié)調(diào)線程執(zhí)行的先后次序。CountDownLatch是基于時(shí)間維度的Semaphore則是基于信號(hào)維度的2022-05-05

