java - 带有 CookieManager 的 HttpURLConnection 是否应该自动处理 session cookie?

标签 java cookies httpurlconnection cookiemanager

我有一个 Java 应用程序 (JDK 1.7.0_13),并且正在使用 java.net.HttpURLConnection 连接到一些基于 servlet 的服务,这些服务进行 session 管理。我想弄清楚如何使用 java.net.CookieManager 来跟踪 session cookie。阅读文档我得到的印象是使用 CookieHandler.setDefault(new CookieManager()) 安装 CookieManager 应该会导致 cookie 管理自动发生。但是,对同一 URL 的多个请求似乎不会保留 cookie。我是否必须手动从响应中提取 cookie 并自己在请求中重新发送它们,还是 CookieManager 会自动为我执行此操作?如果 CookieManager 没有,那么它增加了什么值(value)?

为了进行测试,我有一个 servlet,每次浏览器访问 URL 时都会成功地增加一个计数器。这在 Safari、FireFox 和 Chrome 中运行良好……但是,我无法在独立的 Java 应用程序中运行它。

这是一个非常简单的测试程序来说明我希望简单的工作。它在开始时安装 CookieManager,然后在控制台输入 URL 时重复调用 fetch(String urlString) 方法。

package com.brilliant.experimental;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpFetcher {  
    public static void fetch(String urlString) {
        try {
            URL url = new URL(urlString);
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            InputStream in = conn.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            int status = conn.getResponseCode();
            System.out.println("Status = " + status);
            String key;
            System.out.println("Headers-------start-----");
            for (int i = 1; (key = conn.getHeaderFieldKey(i)) != null; i++) {
                System.out.println(key + ":" + conn.getHeaderField(i));
            }
            System.out.println("Headers-------end-----");
            System.out.println("Content-------start-----");
            String inputLine;
            while ((inputLine = reader.readLine()) != null) {
                System.out.println(inputLine);
            }
            System.out.println("Content-------end-----");
            in.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    public static void main(String[] args) {
        CookieHandler.setDefault(new CookieManager());

        for (int i = 0; i < args.length; i++) {
            fetch(args[i]);
        }

        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader reader = new BufferedReader(isr);
        String prompt = "> ";
        String urlString;
        try {
            for (System.out.print(prompt);
                    (urlString = reader.readLine()) != null; 
                    System.out.print(prompt)) 
            {
                fetch(urlString);
            }
        } catch (IOException ioe) {
            System.out.println(ioe);
        }
    }

}

从这个应用程序调用我的 servlet 显然会从服务器返回一个 session cookie。但是,再次调用会获得一个新的 session cookie。

> http://localhost:8080/brilliant/TestServlet
Status = 200
Headers-------start-----
Server:Resin/4.0.34
Cache-Control:private
Set-Cookie:JSESSIONID=aaaMp0uKke4gp9_-nUuZt; path=/
Content-Length:19
Date:Wed, 13 Feb 2013 18:02:31 GMT
Headers-------end-----
Content-------start-----
Session count is 0
Content-------end-----
> http://localhost:8080/brilliant/TestServlet
Status = 200
Headers-------start-----
Server:Resin/4.0.34
Cache-Control:private
Set-Cookie:JSESSIONID=aaaZ-oPaC1I9WdEDoUuZt; path=/
Content-Length:19
Date:Wed, 13 Feb 2013 18:02:33 GMT
Headers-------end-----
Content-------start-----
Session count is 0
Content-------end-----

所以,总而言之,我是否必须做一些其他事情才能让 CookieManager 自动为我工作,还是我必须求助于从响应中手动提取 cookie 并通过请求重新发送它们?

最佳答案

我运行你的代码并替换它

CookieHandler.setDefault(new CookieManager()); 

CookieHandler.setDefault( new CookieManager( null, CookiePolicy.ACCEPT_ALL ) );

成功了!

关于java - 带有 CookieManager 的 HttpURLConnection 是否应该自动处理 session cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14860087/

相关文章:

java - 编译器先编译Object还是String?

java - sqlite for android,如何更新表

asp.net - 几次 window.open 调用后,我的 ASP.NET session 超时

Java多连接下载

java - Android HttpsURLConnection post 问题

java - 在 R 中读取 XLSX 文件时出错

java - 如何让File类使用相对路径?

json - 跨域复制 cookie,为什么 IE 会阻止其他浏览器使用 SCRIPT 标签发送的 cookie

cookies - 为什么从 "www"子域到另一个子域的请求被视为 "same-site"?

java - ANDROID - 如何使用 httpurlconnection 从 android 中的 Web 服务获得成功返回?