Android Volley支持多个cookie

 原创文章,转载请注明出处:http://blog.csdn.net/wj2030/article/details/43731703

       最近在做一个项目,考虑到volley使用比较方便,就将其选择为网络工具。可是在使用途中发现,由于我们的项目在登录验证的时候,返回了多个cookie.也就是返回的头信息中Set-Cookie有多个值,但是volley在onResponse中只能得到一个cookie.刚开始非常郁闷,以至于我又用HttpClient编写了一个测试程序。发现,的确是volley的问题。找到问题就好办了,volley是开源的想怎么修改,就怎么修改。

         关于volley的详解,不了解的可以看看郭神的博客。这里附上郭神的文章地址:http://blog.csdn.net/guolin_blog/article/details/17482095   

         可以知道,在网络通信过程中volley会根据版本号选择使用httpclientStack或则hurlStack。通过查看两者的源代码如下:

HttpClientStack-->

[java]  view plain copy
  1. public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)  
  2.             throws IOException, AuthFailureError {  
  3.         HttpUriRequest httpRequest = createHttpRequest(request, additionalHeaders);  
  4.         addHeaders(httpRequest, additionalHeaders);  
  5.         addHeaders(httpRequest, request.getHeaders());  
  6.         onPrepareRequest(httpRequest);  
  7.         HttpParams httpParams = httpRequest.getParams();  
  8.         int timeoutMs = request.getTimeoutMs();  
  9.         // TODO: Reevaluate this connection timeout based on more wide-scale  
  10.         // data collection and possibly different for wifi vs. 3G.  
  11.         HttpConnectionParams.setConnectionTimeout(httpParams, 5000);  
  12.         HttpConnectionParams.setSoTimeout(httpParams, timeoutMs);  
  13.         return mClient.execute(httpRequest);  
  14.     }  

很明显没啥异常。但是HurlStack-->中如下:

[java]  view plain copy
  1. public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)  
  2. throws IOException, AuthFailureError {  
  3. String url = request.getUrl();  
  4. HashMap<String, String> map = new HashMap<String, String>();  
  5. map.putAll(request.getHeaders());  
  6. map.putAll(additionalHeaders);  
  7. if (mUrlRewriter != null) {  
  8. String rewritten = mUrlRewriter.rewriteUrl(url);  
  9. if (rewritten == null) {  
  10. throw new IOException("URL blocked by rewriter: " + url);  
  11. }  
  12. url = rewritten;  
  13. }  
  14. URL parsedUrl = new URL(url);  
  15. HttpURLConnection connection = openConnection(parsedUrl, request);  
  16. for (String headerName : map.keySet()) {  
  17. connection.addRequestProperty(headerName, map.get(headerName));  
  18. }  
  19. setConnectionParametersForRequest(connection, request);  
  20. // Initialize HttpResponse with data from the HttpURLConnection.  
  21. ProtocolVersion protocolVersion = new ProtocolVersion("HTTP"11);  
  22. int responseCode = connection.getResponseCode();  
  23. if (responseCode == -1) {  
  24. // -1 is returned by getResponseCode() if the response code could not be retrieved.  
  25. // Signal to the caller that something was wrong with the connection.  
  26. throw new IOException("Could not retrieve response code from HttpUrlConnection.");  
  27. }  
  28. StatusLine responseStatus = new BasicStatusLine(protocolVersion,  
  29. connection.getResponseCode(), connection.getResponseMessage());  
  30. BasicHttpResponse response = new BasicHttpResponse(responseStatus);  
  31. response.setEntity(entityFromConnection(connection));  
  32. for (Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) {  
  33. if (header.getKey() != null) {  
  34. Header h = new BasicHeader(header.getKey(), header.getValue().get(0));                    // 这里发现一个问题  
  35. response.addHeader(h);  
  36. }  
  37. }  
  38. return response;  
  39. }  
如上注释,我们可以看到,在hurlStack中,添加到response中的header只是每一中头信息的第一项,也就是导致我Set-Cookie最后只有第一个cookie后面的都没有了。既然发现里问题,那就修改,只需要修改一点,我的修改如下:

[java]  view plain copy
  1. for (Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) {  
  2.             if (header.getKey() != null) {  
  3.                 StringBuffer sb = new StringBuffer();  
  4.                 for(int i=0;i<header.getValue().size();i++){  
  5.                     sb.append(header.getValue().get(i));  
  6.                     sb.append("\n");  
  7.                 }  
  8.                 Header h = new BasicHeader(header.getKey(),sb.toString());  
  9.                 //Header h = new BasicHeader(header.getKey(), header.getValue().get(0));  
  10.                 response.addHeader(h);  
  11.             }  
  12.         }  

这样返回的response中的头信息就全部在里,只是每一个cookie之间添加里一个回车而已。下面贴上我打包生存的.arr文件。方便各位使用。

你可能感兴趣的:(android,Volley支持多个co)