《HttpClient官方文档》2.7 连接套接字工厂

2.7. Socket连接工厂

HTTP连接在内部使用java.net.Socket类的对象来处理数据在线路上的传输。 然而,他们依靠 ConnectionSocketFactory接口来创建,初始化和连接Socket。HttpClient的使用者能够在运行时,提供应用程序特定的Socket初始化代码。PlainConnectionSocketFactory类是创建和初始化普通(未加密)套接字的默认工厂类。

创建一个套接字和连接到主机的过程是解耦的,以便连接操作被阻塞的时候套接字能够被关闭

HttpClientContext clientContext = HttpClientContext.create();
PlainConnectionSocketFactory sf = PlainConnectionSocketFactory.getSocketFactory();
Socket socket = sf.createSocket(clientContext);
int timeout = 1000; //ms
HttpHost target = new HttpHost("localhost");
InetSocketAddress remoteAddress = new InetSocketAddress(
        InetAddress.getByAddress(new byte[] {127,0,0,1}), 80);
sf.connectSocket(timeout, socket, target, remoteAddress, null, clientContext);

2.7.1. 安全套接字层

LayeredConnectionSocketFactory接口是 ConnectionSocketFactory接口的扩展。阶层式套接字工厂能够在现有普通套接字上创建层次化的套接字。层次化套接字主要用于通过代理创建安全套接字。
HttpClient附带了实现SSL / TLS分层的SSLSocketFactory类。请注意 HttpClient 不使用任何自定义的加密功能,它完全依赖于 Java 加密 (JCE) 和安全套接字 (JSEE) 扩展标准。

2.7.2. 连接管理器集成

自定义连接套接字工厂可以与特定的协议方案相关联,如HTTP或HTTPS,然后用来创建自定义连接管理器。

ConnectionSocketFactory plainsf = <...>
LayeredConnectionSocketFactory sslsf = <...>
Registry<ConnectionSocketFactory> r = RegistryBuilder.<ConnectionSocketFactory>create()
        .register("http", plainsf)
        .register("https", sslsf)
        .build();

HttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(r);
HttpClients.custom()
        .setConnectionManager(cm)
        .build();

2.7.3. 自定义SSL/TLS

HttpClient 利用 SSLConnectionSocketFactory类创建 SSL 连接。SSLConnectionSocketFactory类允许高度自定义,可以把javax.net.ssl.SSLContext接口的实例作为参数传入,并使用它来创建自定义配置的SSL连接。

KeyStore myTrustStore = <...>
SSLContext sslContext = SSLContexts.custom()
        .loadTrustMaterial(myTrustStore)
        .build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);

对SSLConnectionSocketFactory类自定义意味着对SSL / TLS协议的概念有一定程度的了解,其详细说明不在本文档范围内。请点击
Java Secure Socket Extension (JSSE) Reference Guide 来获取javax.net.ssl.SSLContext接口和相关工具的详细说明。

2.7.4. 主机名验证

除了在SSL / TLS协议级别上进行信任验证和客户端身份验证之外,一旦建立了连接,HttpClient可以选择性地验证目标主机名是否与存储在服务器的X.509证书中的名称匹配。该验证可以提供对服务器信任材料的真实性的额外保证。javax.net.ssl.HostnameVerifier接口代表主机名验证策略。 HttpClient附带了javax.net.ssl.HostnameVerifier接口的两个实现类。重要:主机名验证和SSL信任验证这两者不应混淆。

  • DefaultHostnameVerifier: HttpClient使用的默认实现类,它应兼容RFC 2818。主机名必须匹配证书指定的任何别名,或在证书持有者没有为别名给出最明确的证书通用名(CN)的情况下。 在证书通用名(CN),以及任何subject-alts中都可以出现通配符。
  • NoopHostnameVerifier类:  作为主机名验证工具,实质上关闭了主机名验证,它接受任何有效的SSL会话并匹配到目标主机。

HttpClient默认使用DefaultHostnameVerifier类来实现。 如果需要,可以指定其他的主机名验证器来实现。

SSLContext sslContext = SSLContexts.createSystemDefault();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
        sslContext,
        NoopHostnameVerifier.INSTANCE);

自版本4.4后HttpClient使用由Mozilla基金维护的公共后缀名列表,以确保SSL证书中的通配符不会被滥用于申请拥有公共顶级域名的多个域。 HttpClient 附带了在释放时回收的列表的副本。 https://publicsuffix.org/list/这个URL能够获取最近的版本号列表,强烈建议制作这个列表的本地副本,并每天从其原始位置下载不超过一次。

PublicSuffixMatcher publicSuffixMatcher = PublicSuffixMatcherLoader.load(
    PublicSuffixMatcher.class.getResource("my-copy-effective_tld_names.dat"));
DefaultHostnameVerifier hostnameVerifier = new DefaultHostnameVerifier(publicSuffixMatcher);

可以使用“null”这个参数来禁用对公共后缀名列表的验证。

DefaultHostnameVerifier hostnameVerifier = new DefaultHostnameVerifier(null);

 转载自 并发编程网 - ifeve.com

时间: 2024-08-31 09:58:41

《HttpClient官方文档》2.7 连接套接字工厂的相关文章

《HttpClient官方文档》2.3 HTTP连接管理

2.3. HTTP 连接管理 2.3.1. 管理连接和连接管理器 HTTP 连接是复杂的. 有状态的. 非线程安全的对象,因此需要恰当的管理才能正常工作.HTTP连接一次只能由一个线程使用.HttpClient使用实现了HttpClientConnectionManager接口,被称为HTTP连接管理器的特殊实体去访问HTTP连接. HTTP连接管理器的作用是作为一个工厂类来为新的HTTP连接使用,管理持久连接的生命周期和同步访问,确保一次只能由一个线程使用连接. HTTP连接管理器内部与Man

《HttpClient官方文档》2.6 连接维持存活策略

2.6. 连接维持存活策略 HTTP规范不会指定长连接存活的时间,以及是否应该维持连接.一些HTTP服务器使用非标准的"Keep-Alive"头部来与客户端通信,以维持连接在服务器端存活的时间(以秒为单位).如果这个可用, HttpClient将利用它.如果响应中不存在"Keep-Alive"头部,则HttpClient假定连接可以无限期存活.然而,通常许多HTTP服务器在使用中配置为不通知客户端,长连接在闲置一定时期之后会被丢弃,以便节省系统资源. 万一默认策略导

《HttpClient官方文档》第六章 HTTP 缓存

第六章. HTTP缓存 6.1. 通用概念 HttpClient Cache 提供了用HttpClient(等效浏览器缓存的Java实现)来兼容HTTP / 1.1的缓存层.实现遵循责任链模式,HttpClient缓存的实现类可以替代默认无缓存的HttpClient;完全可以通过缓存实现的请求将不会触发实际的原始请求.在可以的情况下,使用GETs条件If-Modified-Since和/or If-None-Match请求头,会自动验证旧的缓存项.HTTP / 1.1缓存一般被设计成语义透明的,

《HttpClient官方文档》1.3 HTTP执行上下文

1.3 HTTP执行上下文 HTTP起初是被设计成一种无状态的.面向请求和响应的协议.然而实际的应用经常需要在请求-响应切换过程中保存状态信息.为了使应用能够维持处理状态,HttpClient允许HTTP请求可以在一个特殊的上下文环境(HttpContext)中执行.如果一个context在连续的HTTP请求中被复用,那么这些逻辑相关的请求可以参与到同一个逻辑会话中.HttpContext功能与java.util.Map<String, Object>类似,它是一组任意值的集合.一个应用程序可

《HttpClient官方文档》HTTP验证4.4-4.7

4.4 HTTP验证和执行上下文 HttpClient依赖于AuthState类来追踪验证进程的状态的详细信息.HttpClient在执行HTTP请求执行时,创建AuthState的两个实例:一个对目标主机认证,另外一个用于代理认证.一旦目标主机或者代理要求用户验证,对应的AuthState实例将会在验证过程中被AuthScope,AuthScheme和Crednetials填充.这个AuthState可以被检查用于找出哪种类型要求验证,是否对应的AuthScheme被找到,以及凭证提供者可以找

《HttpClient官方文档》1.2 HttpClient 接口

1.2. HttpClient 接口 HttpClient 接口表示最基本的HTTP请求执行要约.它不会对请求执行过程加上约束或一些特定的信息,并且保留连接管理,状态管理,认证和处理重定向的细节到各自的实现中.这会使它更方便的使用额外功能来装饰接口,如响应内容缓存. 通常来说, HttpClient接口的实现负责处理特定方面的HTTP协议,比如重定向.身份认证处理.对连接的持久性和维持连接存活长短的决策之类的多个处理程序和策略接口实现的门面. 这使得用户能够有选择性的将一些自定义的,基于特定应用

《HttpClient官方文档》1.1 执行请求(二)

1.1.4. HTTP 实体 HTTP 消息可以携带与其相关联的请求或响应的内容实体.实体可以在一些请求和响应中找到,因为它们也是可选的.使用了实体的请求被称为封闭实体请求.HTTP规范定义了两种封闭实体的方法: POST 和PUT.响应通常期望包含一个内容实体. 这个规则也有特例,就像HEAD 方法和 204 No Content,304 Not Modified, 205 Reset Content 响应. HttpClient根据其内容来源以此区分三种类型的实体: streamed(流式)

《HttpClient官方文档》2.8 HttpClient代理配置

2.8. HttpClient代理配置 即使HttpClient意识到路由方案和代理连接的复杂性,它也只支持简单直连或单跳代理连接的开箱即用. 通知HttpClient连接到目标主机,最简单的方法是通过设置默认参数的代理: HttpHost proxy = new HttpHost("someproxy", 8080); DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy); Closea

《HttpClient 官方文档》第五章 Fluent API

第五章:流式 API 5.1 易用 API 接口 4.2版本的 HttpClient 带来了一组非常容易使用的流式 API(Fluent API) 接口.暴露的流式API(Fluent API) 接口中仅仅是 HttpClient 最基本的一些功能,这些接口是在不需要使用 HttpClient 丰富的灵活性时,为了一些简单的功能而准备的. 例如:流式接口(Fluent API) 增加了使用者对连接的管理和资源的分配上的便利性.这里有一系列通过 HttpClient 流式接口(Fluent API