`
thinkerAndThinker
  • 浏览: 284853 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

httpclient保持会话登录

 
阅读更多

1.连接池原理(待续)

2.httpclient连接池如何保证连接交回至连接池管理器

    2.1 方式一

Java代码  收藏代码
  1. HttpResponse response = (httpMethod);  
  2. HttpEntity entity = response.getEntity();  
  3. //这两段代码返回的entity是HttpEntity的实现类BasicManagedEntity。此时与本次请求关联的连接尚未归还至连接管理器。需要调用以下两条语句:  
  4. InputStream instream = entity.getContent();//获得响应具体内容  
  5. //处理响应:代码省略  
  6. instream.close();//关闭输入流同时会将连接交回至连接处理器  

     2.2 方式二使用默认的响应处理器BasicResponseHandler

Java代码  收藏代码
  1. httpClient Jar包中提供BasicResponseHandler。如果返回的类型能确定需要解码为String类型的话,推荐使用该响应处理器。  
  2. 该处理器解码http连接响应字节流为String类型,对返回码>=300的响应进行了异常封装,并能够保证连接交还给连接池管理器。  
  3. 该处理器将字节解码为字符的过程依次如下:  
  4. 1)如果响应http报文Head部分由指定的charset,则使用该charset进行解码,否则进行下一步。例如使用UTF-8解码以下响应:DEBUG org.apache.http.headers - $amp;  
  5. 2)如果响应报文未执行charset,则使用传入EntityUntils.toString()时指定的charset进行解码。否则进行下一步  
  6. 3)使用ISO-8859-1进行解码。  

 

3.实现连接池(待续)

4.遇到的问题

    4.1 连接池阻塞,频繁的报以下错误信息

Java代码  收藏代码
  1. pooling post() method executing IOException:java.net.SocketTimeoutException: Read timed out  
  2. java.net.SocketTimeoutException: Read timed out  
  3.         at java.net.SocketInputStream.socketRead0(Native Method)  
  4.         at java.net.SocketInputStream.read(SocketInputStream.java:129)  
  5.         at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:136)  
  6.         at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:152)  
  7.         at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:270)  
  8.         at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:140)  
  9.         at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)  
  10.         at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:260)  
  11.         at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:161)  
  12.         at sun.reflect.GeneratedMethodAccessor96.invoke(Unknown Source)  
  13.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
  14.         at java.lang.reflect.Method.invoke(Method.java:597)  
  15.         at org.apache.http.impl.conn.CPoolProxy.invoke(CPoolProxy.java:138)  
  16.         at com.sun.proxy.$Proxy43.receiveResponseHeader(Unknown Source)  
  17.         at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:271)  
  18.         at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)  
  19.         at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:254)  
  20.         at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195)  
  21.         at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:85)  
  22.         at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108)  
  23.         at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:186)  
  24.         at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72)  
  25.         at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:214)  
  26.         at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:160)  
  27.         at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:136)  

 上述问题主要问题是连接池中httpclient连接在遇到异常情况下未正常关闭导致,出问题时候连接池关于回收httpclient连接的代码如下:

Java代码  收藏代码
  1. private ResponseHandler<String> responseHandler = new ResponseHandler<String>() {  
  2.     public String handleResponse(final HttpResponse response) throws ClientProtocolException, IOException {  
  3.         int status = response.getStatusLine().getStatusCode();  
  4.         if (status >= HttpStatus.SC_OK && status < HttpStatus.SC_MULTIPLE_CHOICES) {  
  5.             HttpEntity entity = response.getEntity();  
  6.               
  7.             Charset charset = ContentType.getOrDefault(entity).getCharset();  
  8.             if (charset == null) {  
  9.                 charset = Charset.forName("UTF-8");  
  10.             }  
  11.             return entity != null ? EntityUtils.toString(entity, charset) : null;  
  12.         } else {  
  13.                             //注意这里没有告诉连接池要回收连接  
  14.             throw new ClientProtocolException("Unexpected response status: " + status);  
  15.         }  
  16. };  

 修改后的代码如下:

Java代码  收藏代码
  1. private ResponseHandler<String> responseHandler = new ResponseHandler<String>() {  
  2.     public String handleResponse(final HttpResponse response) throws ClientProtocolException, IOException {  
  3.   
  4.         final StatusLine statusLine = response.getStatusLine();  
  5.         final HttpEntity entity = response.getEntity();  
  6.         if (statusLine.getStatusCode() >= HttpStatus.SC_MULTIPLE_CHOICES||statusLine.getStatusCode()<HttpStatus.SC_OK) {  
  7.             //主动回收httpclient连接  
  8.         EntityUtils.consume(entity);  
  9.             throw new HttpResponseException(statusLine.getStatusCode(),  
  10.                     statusLine.getReasonPhrase());  
  11.         }  
  12.         Charset charset = ContentType.getOrDefault(entity).getCharset();  
  13.         if (charset == null) {  
  14.             charset = Charset.forName("UTF-8");  
  15.         }  
  16.         return entity != null ? EntityUtils.toString(entity, charset) : null;  
  17.     }  
  18. };  
分享到:
评论

相关推荐

    httpclient如何保持session会话模拟登录后的操作

    通过以上步骤,你就可以使用HTTPClient保持session会话并模拟登录后的操作了。注意,实际应用中可能需要处理更复杂的情况,比如重定向、处理不同类型的认证机制(如OAuth)、处理异常等。此外,对于大型项目,建议...

    Java 使用HttpClient保持SESSION状态

    以上就是在Java中使用HttpClient保持SESSION状态的基本流程。在实际项目中,可能还需要处理重定向、超时、错误处理等复杂情况。注意,对于HTTPS站点,可能需要配置SSLContext和TrustManager,以允许HttpClient信任自...

    HttpClient模拟登录实例

    在实际应用中,为了保持会话状态,通常需要处理服务器返回的cookies。HttpClient提供了`CookieStore`接口,可以用来存储和管理cookies。 总之,HttpClient提供了一套强大的API,使Java开发者能够轻松地模拟浏览器...

    (最新)HttpClient4模拟登录腾讯微博

    在模拟登录过程中,通常需要设置POST请求,填充登录表单数据,如用户名、密码,并可能需要处理登录后的Session和Cookie来保持会话状态。 首先,我们需要引入HttpClient4的相关依赖到项目中。如果是Maven项目,可以...

    使用HttpClient登录网易邮箱

    对于登录操作,可能需要解析返回的Cookie,以便后续的会话保持。 8. **异常处理**:捕获并处理可能出现的网络异常、解析异常等。 9. **关闭连接**:记得在操作完成后关闭HttpClient和响应的连接,释放资源。 在...

    HttpClient 登录163邮箱

    - 如果登录成功,服务器可能会返回一个会话cookie,HttpClient需要保存这个cookie以保持登录状态。 3. **HttpClient API使用** - `HttpClient`实例化:创建一个`HttpClient`对象,可以设置连接超时、重试策略等...

    java模拟淘宝登录源码

    登录成功后,服务器会返回一些关键的标识,如Session ID或Cookie,这些标识用于后续的会话保持。 三、HTTP请求构造 使用HTTPClient构建登录请求时,需要创建`HttpPost`对象,设置目标URL为淘宝的登录接口。然后,...

    httpclient4.2.1.zip

    5. **支持Cookie管理**:HttpClient能够自动处理服务器返回的Cookie,保持会话状态。 6. **代理设置**:支持配置HTTP代理和SOCKS代理,适应不同网络环境的需求。 7. **安全通信**:通过SSL/TLS协议支持HTTPS,确保...

    用httpclient写的登录开心网

    标题中的“用httpclient写的登录开心网”表明我们将探讨如何使用Apache HttpClient库来实现对开心网的模拟登录。HttpClient是一个Java库,它提供了强大的HTTP客户端功能,包括发起HTTP请求、处理响应以及管理会话等...

    httpclient3 自动登陆淘宝, 开心网

    - **保存Session**:成功登录后,获取服务器返回的Session ID或其他认证信息,以便在后续请求中保持会话状态。 - **再次请求**:使用保存的Session信息构造新的请求,模拟已登录状态访问其他页面。 3. **淘宝和...

    Httpclient依赖包

    4. **Cookie管理**:HttpClient内置了Cookie管理器,可以处理服务器返回的Cookie,保持会话状态,支持标准的Cookie规范。 5. **SSL/TLS支持**:HttpClient支持安全的HTTPS通信,可以自定义SSL上下文,处理证书、...

    HTTPClient 的一个封装

    - **Cookie管理**:处理服务器返回的Cookie,保持会话状态。 - **SSL/TLS支持**:配置SSL上下文,处理HTTPS请求。 - **重试策略**:当请求失败时,自动按照预设策略进行重试。 - **线程安全**:确保封装的HttpClient...

    httpclient4.1.2.zip

    此外,HttpClient 4.1.2还提供了对cookies的处理,通过`CookieStore`和`CookieSpec`接口,可以实现cookies的存储、读取和管理,从而保持会话状态。 在错误处理上,HttpClient 4.1.2引入了重试策略,当网络不稳定...

    使用HttpClient必须的jar包

    5. **Cookie管理**:HttpClient支持`CookieSpecs`和`CookieStore`,用于处理服务器返回的Cookie,实现会话保持。 6. **请求和响应处理**:HttpClient允许自定义请求实体和响应处理器,支持JSON、XML等数据格式的...

    httpclient-4.5.2.jar.zip

    - **使用Cookie管理器**:对于处理需要保持会话的请求,可以使用`CookieStore`和`CookiePolicy`来管理Cookie。 - **处理重定向**:HttpClient支持自动处理重定向,但也可以通过配置关闭此功能,自定义重定向策略。...

    org.apache.commons.httpclient相关架包

    5. **Cookie管理**:HttpClient可以自动处理服务器返回的cookies,保持会话状态,方便处理登录和其他需要保持状态的场景。 6. **异步请求**:虽然HttpClient主要是同步操作,但通过配合线程或者回调机制,可以实现...

    HttpClient Demo

    9. **Cookie管理**:HttpClient提供了`CookieStore`和`CookieSpec`接口,用于处理服务器返回的Cookie,保持会话状态。 10. **性能优化**:HttpClient 4.3通过连接池和多线程等技术提高了性能。你还可以根据需求调整...

Global site tag (gtag.js) - Google Analytics