system.setproperty(system.setproperty设置TLS1.2)满满干货
在 Java 应用中读取远程 URL 内容是一个比较常见的需求,可以使用 Apache 旗下的开源项目 Httpclient 来实现。
记得之前在公众号提过曾经在 T 公司做 Java 爬虫,有读者对爬虫的实现很感兴趣在 Java 应用中读取远程 URL 内容是一个比较常见的需求,可以使用 Apache 旗下的开源项目 Httpclient 来实现。
Httpclient 基于 Java 语言,实现了 HTTP 1.0 和 HTTP 1.1 协议实现了 GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE 等全部方法支持使用代理建立连接。
支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接能够自动处理 cookie,支持用 KeepAlive 来保持持久连接使用 Httpclient 很简单,在如下的示例代码中,分为以下几个步骤:
创建 HttpClient 对象,这里使用了默认设置;创建请求对象 httpGet,对应一次 get 请求;调用 HttpClient.execute 执行一次请求,得到的返回是 response;通过 response 可以获取返回的状态和HTML内容;
CloseableHttpClient httpclient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet("http://www.baidu.com"
); CloseableHttpResponse response = httpclient.execute(httpGet); try { System.out.println(response.getStatusLine()); HttpEntity entity = response.getEntity(); System.
out.println(EntityUtils.toString(entity)); } finally { response.close(); }发送 get 请求,需要创建 HttpGet 请求。
发送 post 请求,需要创建 HttpPost 请求如果是带参数的请求,可以直接拼接在 URL 中,也可以使用 URIBuilder 创建对象然后通过 addParameter 或 setParameter 方法添加 。
如果需要设置请求 header,可以调用 addHeader 或 setHeader 方法设置 header对于 post 请求,可以调用 setEntity 方法设置请求的数据如 post.setEntity(new StringEntity(body, "utf-8"))。
支持提交多种数据:StringEntity:纯文本内容,比如提交 json 数据;FileEntity:文件,比如文件上传;ByteArrayEntity:字节流数据,比如提交序列化数据;UrlEncodedFormEntity:表单数据,比如提交 form 表单;
InputStreamEntity:输入流数据,比如文件上传;SerializableEntity:序列化数据,支持提交 Serializable 序列化对象;BasicHttpEntity:通用数据,使用者自行写入流和内容长度。
调用 HttpClient 的 execute 方法发送请求,返回的是一个 HttpResponse 对象通过该对象可以获取返回的所有数据:getStatusLine:获取返回状态 StatusLine 对象,如 HTTP/1.1 200 OK;。
getEntity:获取返回的内容,如 HTML 数据;getHeaders / getAllHeaders:获取返回的 header 内容;设置请求参数HttpClient 支持设置 RequestConfig 来配置请求默认参数。
一般使用 RequestConfig.Builder 来构建 RequestConfigBuilder 支持进行如下设置:setProxy:设置代理服务器,需要传入 HttpHost 对象;setLocalAddress:设置本地地址;
setCookieSpec:设置 cookie 处理策略;setRedirectsEnabled:设置是否允许自动跳转,处理 302 等响应;setMaxRedirects:设置最大跳转数量,302 跳转次数;
setAuthenticationEnabled:设置是否启用认证,如启用需要提供密码;setConnectionRequestTimeout:设置连接请求超时时间,指从连接池获取连接的timeout;
setConnectTimeout:设置连接超时时间,指客户端和服务器建立连接的timeout;setSocketTimeout:设置 socket 时间,指客户端从服务器读取数据的timeout;RequestConfig 构建后,需要调用 HttpClient setDefaultRequestConfig 方法设置到客户端中。
使用代理通过 RequestConfig.setProxy 可以设置请求的代理,在爬虫等场景非常实用代理的对象类型是 HttpHost,一般设置代理的 ip 和端口如果代理有密码,可以使用 CredentialsProvider 配置用户名和密码自动完成认证。
CredentialsProvider credsProvider = new BasicCredentialsProvider(); //使用密码的代理端口 credsProvider.setCredentials(
new AuthScope(null,port), //用户名和密码new UsernamePasswordCredentials(username,password) ); httpClientBuilder.setDefaultCredentialsProvider(credsProvider);
支持 HTTPS 协议请求 HTTPS 需要在 HttpClient 中设置 ssl 协议主要分为以下几个步骤:创建 SSL 协议上下文 SSLContext,通常使用 SSLContextBuilder 构建;。
创建 SSLConnectionSocketFactory,是 TLS/SSL 连接的 socket 工厂;向连接工厂中注册 https 协议使用 SSLConnectionSocketFactory 处理;
创建连接池管理器 PoolingHttpClientConnectionManager,并注册 HTTPS;向 HttpClient 设置连接池管理器如果请求报错 HTTPS 证书问题,可以设置忽略证书。
设置系统变量 System.setProperty("jsse.enableSNIExtension", "false"); 即可// 需要通过以下代码声明对https连接支持 SSLContext sslcontext = SSLContexts.custom() .loadTrustMaterial(null,
new TrustSelfSignedStrategy()) .build(); // SSL 连接工厂 SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, NoopHostnameVerifier.INSTANCE); Registry socketFactoryRegistry = RegistryBuilder . create() .
register("http",PlainConnectionSocketFactory.getSocketFactory()) .register("https", sslsf).build();
// 初始化连接管理器 PoolingHttpClientConnectionManager poolConnManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); client = HttpClients.custom() .setConnectionManager(poolConnManager) .build();
推荐阅读30 个 Spring 常用注解与差异总结又到黄金季节,该跳槽吗?怎么跳?分布式事务 6 个技术方案15 个 MyBatis 技巧,赶紧收藏吧!你的工资被倒挂了吗
- 标签:
- 编辑:李松一
- 相关文章
-
windows优化大师官网(WINDOWS优化大师是什么软件)一看就会
作者将大家装机常用的一些软件做了收集和整理,当我们重装系统或者想要下载绿色软件时,它能帮我们节省很多时间,相信很多小伙伴们都能…
-
office2007兼容包(office2007兼容包for2003)难以置信
微软office指微软公司推出一款适合Windows系统使用的办公软件,后来又改名为微软office365,无论名字怎么改都是为了,推广会员收费…
- 网站安全检测(怎么关闭浏览器网站安全检测)硬核推荐
- 笔记本蓝牙驱动(笔记本蓝牙驱动安装失败)这都可以?
- 深度ghost(深度水解奶粉哪个品牌好)学到了吗
- 证书错误(打开浏览器显示证书错误)速看
- 显卡位宽(显卡位宽128够用吗)干货满满