亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

httpclient的disableConnectionState方法工作流程

 更新時間:2023年11月20日 08:54:57   作者:codecraft  
這篇文章主要為大家介紹了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

小結

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的詳細內容,更多關于httpclient disableConnectionState的資料請關注腳本之家其它相關文章!

相關文章

  • springboot讀取application.yaml文件數(shù)據(jù)的方法

    springboot讀取application.yaml文件數(shù)據(jù)的方法

    這篇文章主要為大家詳細介紹了springboot讀取application.yaml文件數(shù)據(jù)的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • struts2簡介_動力節(jié)點Java學院整理

    struts2簡介_動力節(jié)點Java學院整理

    Struts2框架是MVC流程框架,適合分層開發(fā),這篇文章主要為大家詳細介紹了struts2簡介的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • MyBatis批量插入數(shù)據(jù)到Oracle數(shù)據(jù)庫中的兩種方式(實例代碼)

    MyBatis批量插入數(shù)據(jù)到Oracle數(shù)據(jù)庫中的兩種方式(實例代碼)

    本文通過實例代碼給大家分享了MyBatis批量插入數(shù)據(jù)到Oracle數(shù)據(jù)庫中的兩種方式,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-09-09
  • Hikari連接池使用SpringBoot配置JMX監(jiān)控實現(xiàn)

    Hikari連接池使用SpringBoot配置JMX監(jiān)控實現(xiàn)

    Hikari是Spring Boot默認的數(shù)據(jù)庫連接池。區(qū)別于C3P0直接通過連接池對象獲取各項狀態(tài)指標,Hikari需要通過JMX來獲取。本文就詳細的來介紹一下,感興趣的可以了解一下
    2021-07-07
  • Java中eq、ne、ge、gt、le、lt的含義詳細解釋

    Java中eq、ne、ge、gt、le、lt的含義詳細解釋

    Java中的比較運算符包括eq(等于)、ne(不等于)、ge(大于或等于)、gt(大于)、le(小于或等于)和lt(小于),這些運算符在控制流語句和條件語句中用于判斷條件是否滿足,從而決定程序的執(zhí)行路徑,需要的朋友可以參考下
    2024-11-11
  • 詳解Spring Boot 項目部署到heroku爬坑

    詳解Spring Boot 項目部署到heroku爬坑

    這篇文章主要介紹了詳解Spring Boot 項目部署到heroku爬坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • Java視頻格式轉化的實現(xiàn)方法

    Java視頻格式轉化的實現(xiàn)方法

    這篇文章主要為大家詳細介紹了Java視頻格式轉化的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Java超詳細講解多線程中的Process與Thread

    Java超詳細講解多線程中的Process與Thread

    進程process:在一定的環(huán)境下,把靜態(tài)的程序代碼運行起來,通過使用不同的資源,來完成一定的任務;線程thread:是程序中一個單一的順序控制流程。在單個進程中同時運行多個線程完成不同的工作,稱為多線程
    2022-05-05
  • java TreeMap源碼解析詳解

    java TreeMap源碼解析詳解

    這篇文章主要介紹了java TreeMap源碼解析詳解的相關資料,需要的朋友可以參考下
    2017-04-04
  • java與scala數(shù)組及集合的基本操作對比

    java與scala數(shù)組及集合的基本操作對比

    這篇文章主要介紹了java與scala數(shù)組及集合的基本操作對比,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評論