httpclient的disableConnectionState方法工作流程
序
本文主要研究一下httpclient的disableConnectionState
disableConnectionState
org/apache/http/impl/client/HttpClientBuilder.java
/**
* Disables connection state tracking.
*/
public final HttpClientBuilder disableConnectionState() {
connectionStateDisabled = true;
return this;
}
public CloseableHttpClient build() {
//......
UserTokenHandler userTokenHandlerCopy = this.userTokenHandler;
if (userTokenHandlerCopy == null) {
if (!connectionStateDisabled) {
userTokenHandlerCopy = DefaultUserTokenHandler.INSTANCE;
} else {
userTokenHandlerCopy = NoopUserTokenHandler.INSTANCE;
}
}
ClientExecChain execChain = createMainExec(
requestExecCopy,
connManagerCopy,
reuseStrategyCopy,
keepAliveStrategyCopy,
new ImmutableHttpProcessor(new RequestTargetHost(), new RequestUserAgent(userAgentCopy)),
targetAuthStrategyCopy,
proxyAuthStrategyCopy,
userTokenHandlerCopy);
//......
}
}HttpClientBuilder提供了disableConnectionState方法可以設置connectionStateDisabled為true,在該值為true時userTokenHandlerCopy為NoopUserTokenHandler.INSTANCE,而userTokenHandlerCopy是作為創(chuàng)建ClientExecChain(MainClientExec)的參數(shù)之一
execute
org/apache/http/impl/execchain/MainClientExec.java
Object userToken = context.getUserToken();
if (userToken == null) {
userToken = userTokenHandler.getUserToken(context);
context.setAttribute(HttpClientContext.USER_TOKEN, userToken);
}
if (userToken != null) {
connHolder.setState(userToken);
}MainClientExec的execute方法會通過context.getUserToken()獲取userToken,在userToken為null時會通過serTokenHandler.getUserToken(context)獲取userToken然后設置到context中,最后將userToken設置到connHolder的state
UserTokenHandler
org/apache/http/client/UserTokenHandler.java
public interface UserTokenHandler {
/**
* The token object returned by this method is expected to uniquely
* identify the current user if the context is user specific or to be
* {@code null} if it is not.
*
* @param context the execution context
*
* @return user token that uniquely identifies the user or
* {@code null} if the context is not user specific.
*/
Object getUserToken(HttpContext context);
}UserTokenHandler定義了getUserToken方法
DefaultUserTokenHandler
org/apache/http/impl/client/DefaultUserTokenHandler.java
@Contract(threading = ThreadingBehavior.IMMUTABLE)
public class DefaultUserTokenHandler implements UserTokenHandler {
public static final DefaultUserTokenHandler INSTANCE = new DefaultUserTokenHandler();
@Override
public Object getUserToken(final HttpContext context) {
final HttpClientContext clientContext = HttpClientContext.adapt(context);
Principal userPrincipal = null;
final AuthState targetAuthState = clientContext.getTargetAuthState();
if (targetAuthState != null) {
userPrincipal = getAuthPrincipal(targetAuthState);
if (userPrincipal == null) {
final AuthState proxyAuthState = clientContext.getProxyAuthState();
userPrincipal = getAuthPrincipal(proxyAuthState);
}
}
if (userPrincipal == null) {
final HttpConnection conn = clientContext.getConnection();
if (conn.isOpen() && conn instanceof ManagedHttpClientConnection) {
final SSLSession sslsession = ((ManagedHttpClientConnection) conn).getSSLSession();
if (sslsession != null) {
userPrincipal = sslsession.getLocalPrincipal();
}
}
}
return userPrincipal;
}
private static Principal getAuthPrincipal(final AuthState authState) {
final AuthScheme scheme = authState.getAuthScheme();
if (scheme != null && scheme.isComplete() && scheme.isConnectionBased()) {
final Credentials creds = authState.getCredentials();
if (creds != null) {
return creds.getUserPrincipal();
}
}
return null;
}
}DefaultUserTokenHandler從context中獲取userPrincipal
NoopUserTokenHandler
org/apache/http/impl/client/NoopUserTokenHandler.java
@Contract(threading = ThreadingBehavior.IMMUTABLE)
public class NoopUserTokenHandler implements UserTokenHandler {
public static final NoopUserTokenHandler INSTANCE = new NoopUserTokenHandler();
@Override
public Object getUserToken(final HttpContext context) {
return null;
}
}NoopUserTokenHandler的getUserToken則返回null
小結(jié)
httpclient的disableConnectionState設置了ClientExecChain(MainClientExec)的UserTokenHandler為NoopUserTokenHandler,而MainClientExec的execute方法會通過context.getUserToken()獲取userToken,在userToken為null時會通過serTokenHandler.getUserToken(context)獲取userToken然后設置到context中,最后將userToken設置到connHolder的state。
connHolder的state與userToken掛鉤起來歧義挺大的
以上就是httpclient的disableConnectionState的詳細內(nèi)容,更多關(guān)于httpclient disableConnectionState的資料請關(guān)注腳本之家其它相關(guān)文章!
- httpclient connect連接請求方法源碼解讀
- httpclient getPoolEntryBlocking連接池方法源碼解讀
- httpclient staleConnectionCheckEnabled獲取連接流程解析
- 解讀httpclient的validateAfterInactivity連接池狀態(tài)檢測
- 探索HttpClient中的close方法及其對連接的影響
- HttpClient的RedirectStrategy重定向處理核心機制
- HttpClient HttpRoutePlanner接口確定請求目標路由
- httpclient ConnectionHolder連接池連接保持源碼解析
相關(guān)文章
數(shù)據(jù)結(jié)構(gòu)與算法之手撕排序算法
排序算法看似簡單,其實不同的算法中蘊涵著經(jīng)典的算法策略。通過熟練掌握排序算法,就可以掌握基本的算法設計思想,本文主要介紹了Java中的排序算法,需要的朋友歡迎閱讀2023-04-04
Spring Boot 與 Kotlin 使用JdbcTemplate連接MySQL數(shù)據(jù)庫的方法
本文介紹在Spring Boot基礎下配置數(shù)據(jù)源和通過 JdbcTemplate 編寫數(shù)據(jù)訪問的示例。感興趣的朋友跟隨腳本之家小編一起學習吧2018-01-01
SpringBoot集成WebSocket實現(xiàn)前后端消息互傳的方法
這篇文章主要介紹了SpringBoot集成WebSocket實現(xiàn)前后端消息互傳的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10
SpringBoot實現(xiàn)自定義Redis的連接的流程步驟
Spring Boot 自定義 Redis 主要是指在基于 Spring Boot 的應用程序中,當你需要更深入地控制或擴展對 Redis 數(shù)據(jù)庫的操作,而不是僅僅依賴 Spring Data Redis 的默認配置,本文給大家介紹了SpringBoot實現(xiàn)自定義Redis的連接的流程步驟,需要的朋友可以參考下2024-09-09
詳解Spring Boot中如何自定義SpringMVC配置
這篇文章主要給大家介紹了關(guān)于Spring Boot中如何自定義SpringMVC配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2021-09-09
MapStruct內(nèi)部錯誤:NullPointerException的解決方案
在Java開發(fā)中,MapStruct是一個非常流行的對象映射工具,它通過注解處理器在編譯時生成映射代碼,極大地簡化了對象之間的轉(zhuǎn)換操作,本文將詳細分析一個常見的MapStruct內(nèi)部錯誤——NullPointerException,并提供一系列解決方案,需要的朋友可以參考下2025-02-02

