当前位置: 首页 > news >正文

聊聊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是作为创建ClientExecChain(MainClientExec)的参数之一

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();@Overridepublic 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();@Overridepublic 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挂钩起来歧义挺大的

http://www.lryc.cn/news/236034.html

相关文章:

  • Tomcat web.xml文件中的mime-mapping
  • 【Java 进阶篇】JQuery 事件绑定:`on` 与 `off` 的奇妙舞曲
  • 模块化Common JS 和 ES Module
  • 基于java web个人财务管理系统
  • soc估计:DESIGN AND DEVELOPMENT OF SoC ESTIMATION MODEL USING MACHINE LEARNING
  • 2、LeetCode之两数相加
  • redis三种集群方式
  • Java --- JVM之垃圾回收相关算法
  • CentOS 7.9 安装 nginx
  • Newman
  • Transformer中WordPiece/BPE等不同编码方式详解以及优缺点
  • Ubuntu20.04安装Beyond Compare 4.4.7
  • 制作含有音频、视频的网页
  • QPair的介绍及用法
  • 掌握未来技术趋势,Python编程引领人工智能时代
  • 【自留地】后端 - PHP - MySQL - Nginx - Python - Java
  • 网页视频下载工具 iTubeGo mac中文版软件特色
  • 深度学习入门(第三天)——卷积神经网络
  • 【Unity小技巧】图片使用的一些常见问题
  • ZJU Beamer学习手册(二)
  • Shaderlab的组成部分SubShader
  • C语言 字符函数汇总,模拟实现各字符函数(炒鸡详细)
  • 微积分在神经网络中的本质
  • CentOS部署Skywalking
  • window上Clion配置C++版本的opencv
  • FPGA时序分析与约束(14)——虚拟路径
  • 【Python】解析CPP类定义代码,获取UML类图信息
  • Docker存储驱动之- overlay2
  • Vue3 shallowRef 和 shallowReactive
  • Python数据分析实战① Python实现数据可视化