【HttpClient4.5中文教程】八.终止请求和重定向处理

1.终止请求

在一些情况下,由于目标服务器的高负载或客户端有很多同时的请求发出,那么 HTTP 请求会在预期的时间内执行失败。 这时,有必要过早地中止请求,解除在 I/O 执行中的线程锁。 HttpClient 执行时,可以在任意阶段通过调用HttpUriRequest#abort()方法中止请求。 这个方法是线程安全的,而且可以从任意线程中调用。当一个 HTTP 请求被中止时,它的执行线程--就封锁在 I/O 操作中了--而且保证通过抛出InterruptedIOException异常来解锁。


2.重定向处理

HttpClient自动处理所有类型的重定向。除了那些由 HTTP 规范明令禁止的,比如需要用

户干预的。参考其它(状态码 303)POST 和 PUT 请求的重定向转换为符合 HTTP 规范要求的 GET请求。你可以使用一个重定向策略,来突破POST方法自动重定向的限制(POST自动重定向为HTTP规范强加)。


在请求报文执行过程中,HttpClient经常需要改写它。每个默认的HTTP/1.0和HTTP/1.1使用相对URI。同样,原始请求需要从一个地址重定向到另一个地址多次。最终绝对的HTTP地址将会被原始的请求和上下文构建。功能方法URIUtils#resolve被使用来构建最终请求形成的绝对URI。这个方法包含了来自于重定向和原始请求的上一个标识。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个异常通常表示 SSL 证书验证失败,可能是因为证书已过期、证书颁发机构不受信任、证书根证书不匹配等原因。 解决这个问题的方法是使用 HttpClient 的 setHostConfiguration 方法设置 SSL 相关参数,例如: ```java HttpClient httpClient = new HttpClient(); Protocol myhttps = new Protocol("https", new MySSLSocketFactory(), 443); HostConfiguration config = httpClient.getHostConfiguration(); config.setHost("example.com", 443, myhttps); ``` 其中,MySSLSocketFactory 是自定义的 SSL Socket 工厂类,可以根据具体情况实现其 createSocket 方法,例如: ```java public class MySSLSocketFactory extends org.apache.commons.httpclient.contrib.ssl.AuthSSLProtocolSocketFactory { @Override public Socket createSocket(String host, int port, InetAddress localAddress, int localPort, HttpConnectionParams params) throws IOException { Socket socket = super.createSocket(host, port, localAddress, localPort, params); if (socket instanceof SSLSocket) { SSLSocket sslSocket = (SSLSocket) socket; SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, new TrustManager[] { new MyX509TrustManager() }, null); sslSocket.setEnabledProtocols(sslSocket.getSupportedProtocols()); sslSocket.setEnabledCipherSuites(sslSocket.getSupportedCipherSuites()); sslSocket.setUseClientMode(true); sslSocket.setNeedClientAuth(false); sslSocket.setWantClientAuth(false); sslSocket.setEnableSessionCreation(true); sslSocket.startHandshake(); } return socket; } } ``` MyX509TrustManager 是自定义的 X509 Trust Manager 类,可以根据具体情况实现其 checkServerTrusted 方法,例如: ```java public class MyX509TrustManager implements X509TrustManager { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { // do nothing } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { // do nothing } @Override public X509Certificate[] getAcceptedIssuers() { return null; } } ``` 这样就可以忽略 SSL 证书验证了,但是需要注意安全风险。如果需要进行 SSL 证书验证,可以参考 HttpClient 的 SSL Guide 进行配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值