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方法可以設(shè)置connectionStateDisabled為true,在該值為true時(shí)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方法會(huì)通過(guò)context.getUserToken()獲取userToken,在userToken為null時(shí)會(huì)通過(guò)serTokenHandler.getUserToken(context)獲取userToken然后設(shè)置到context中,最后將userToken設(shè)置到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設(shè)置了ClientExecChain(MainClientExec
)的UserTokenHandler為NoopUserTokenHandler,而MainClientExec的execute方法會(huì)通過(guò)context.getUserToken()獲取userToken,在userToken為null時(shí)會(huì)通過(guò)serTokenHandler.getUserToken(context)獲取userToken然后設(shè)置到context中,最后將userToken設(shè)置到connHolder的state。
connHolder的state與userToken掛鉤起來(lái)歧義挺大的
以上就是httpclient的disableConnectionState的詳細(xì)內(nèi)容,更多關(guān)于httpclient disableConnectionState的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- httpclient connect連接請(qǐng)求方法源碼解讀
- httpclient getPoolEntryBlocking連接池方法源碼解讀
- httpclient staleConnectionCheckEnabled獲取連接流程解析
- 解讀httpclient的validateAfterInactivity連接池狀態(tài)檢測(cè)
- 探索HttpClient中的close方法及其對(duì)連接的影響
- HttpClient的RedirectStrategy重定向處理核心機(jī)制
- HttpClient HttpRoutePlanner接口確定請(qǐng)求目標(biāo)路由
- httpclient ConnectionHolder連接池連接保持源碼解析
相關(guān)文章
springboot讀取application.yaml文件數(shù)據(jù)的方法
這篇文章主要為大家詳細(xì)介紹了springboot讀取application.yaml文件數(shù)據(jù)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07struts2簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Struts2框架是MVC流程框架,適合分層開發(fā),這篇文章主要為大家詳細(xì)介紹了struts2簡(jiǎn)介的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09MyBatis批量插入數(shù)據(jù)到Oracle數(shù)據(jù)庫(kù)中的兩種方式(實(shí)例代碼)
本文通過(guò)實(shí)例代碼給大家分享了MyBatis批量插入數(shù)據(jù)到Oracle數(shù)據(jù)庫(kù)中的兩種方式,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-09-09Hikari連接池使用SpringBoot配置JMX監(jiān)控實(shí)現(xiàn)
Hikari是Spring Boot默認(rèn)的數(shù)據(jù)庫(kù)連接池。區(qū)別于C3P0直接通過(guò)連接池對(duì)象獲取各項(xiàng)狀態(tài)指標(biāo),Hikari需要通過(guò)JMX來(lái)獲取。本文就詳細(xì)的來(lái)介紹一下,感興趣的可以了解一下2021-07-07Java中eq、ne、ge、gt、le、lt的含義詳細(xì)解釋
Java中的比較運(yùn)算符包括eq(等于)、ne(不等于)、ge(大于或等于)、gt(大于)、le(小于或等于)和lt(小于),這些運(yùn)算符在控制流語(yǔ)句和條件語(yǔ)句中用于判斷條件是否滿足,從而決定程序的執(zhí)行路徑,需要的朋友可以參考下2024-11-11詳解Spring Boot 項(xiàng)目部署到heroku爬坑
這篇文章主要介紹了詳解Spring Boot 項(xiàng)目部署到heroku爬坑,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Java視頻格式轉(zhuǎn)化的實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了Java視頻格式轉(zhuǎn)化的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02Java超詳細(xì)講解多線程中的Process與Thread
進(jìn)程process:在一定的環(huán)境下,把靜態(tài)的程序代碼運(yùn)行起來(lái),通過(guò)使用不同的資源,來(lái)完成一定的任務(wù);線程thread:是程序中一個(gè)單一的順序控制流程。在單個(gè)進(jìn)程中同時(shí)運(yùn)行多個(gè)線程完成不同的工作,稱為多線程2022-05-05java與scala數(shù)組及集合的基本操作對(duì)比
這篇文章主要介紹了java與scala數(shù)組及集合的基本操作對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10