Android DefaultHttpClient HttpResponse缺少Set-Cookie头字段

时间:2011-06-30 21:17:08

标签: android httpclient

我有一台服务器使用Spring安全记忆我认证,我在POST方法中使用Android DefaultHttpClient登录。 我能够成功登录甚至能够检索创建的会话cookie(在我的情况下,jsessionid cookie和spring security记住我的cookie)。

但奇怪的是在执行像

这样的POST方法之后
mResponse = mDefaultHttpClient.execute(mHttpPost)

我可以检索cookie,但只能在我的DefaultHttpClient中使用getCookieStore方法,如

mDefaultHttpClient.getCookieStore()

不使用HttpResponse对象的getAllHeaders方法

headers = mResponse.getAllHeaders();
HeaderIterator headerIterrator = new BasicHeaderIterator(headers, null);
while (headerIterrator.hasNext()) {
  Header header = headerIterrator.nextHeader();
  headerStringBuilder.append(" " + header.getName() + ":" + header.getValue());
}
Log.e("Post response headers: ", headerStringBuilder.toString());

我在这里得到一些标题(服务器,X-powered-By,日期,内容类型,内容长度)但不是Set-Cookie标题或其他几个(Access-control-Allow- * etc)

感谢您的帮助!

更新:看起来DefaultHttpClient不会暴露某些标头。我尝试添加响应拦截器(如下所示)和getAllHeaders返回我想要的所有标头。感谢您阅读我的问题!

    mDefaultHttpClient.addResponseInterceptor(new HttpResponseInterceptor() {
     public void process(final HttpResponse response, final HttpContext context)
                throws HttpException, IOException {
            Header[] headers = response.getAllHeaders();
            for (int i = 0; i < headers.length; i++) {
                Header header = headers[i];
                Log.e("HTTP: ", "name: " + header.getName());
                Log.e("HTTP: ", "value: " + header.getValue());
            }
        }

    });

2 个答案:

答案 0 :(得分:1)

你尝试过使用HttpURLConnection而不是HttpClient吗?顾名思义,HttpClient是一个客户端,然后它为你管理cookie,HttpURLConnection没有。

Doc说“HTTP客户端封装了处理cookie,身份验证,连接管理和其他功能时执行HTTP请求所需的大量对象。”

答案 1 :(得分:0)

如果你在服务器端设置cookie,比如php中的session_start(),那么Set-Cookie会显示在标题中,但如果你没有设置任何cookie,则Set-Cookie没有显示。

后:

05-25 17:23:16.616: I/HTTP:(575): name: Set-Cookie
05-25 17:23:16.616: I/HTTP:(575): value: PHPSESSID=g29i01av8ddvpgsi7lpaj12lc3; path=/