如果HttpURLConnection的与CookieManager自动处理会话cookie?(Sh

2019-07-19 20:28发布

我有一个Java应用程序(JDK 1.7.0_13),并正在使用java.net.HttpURLConnection中连接到做会话管理一些基于servlet的服务。 我试图找出如何使用java.net.CookieManager跟踪会话cookie。 阅读文档,我得到的印象是,与CookieHandler.setDefault安装CookieManager(新CookieManager())将导致cookie管理自动发生。 然而,多个请求相同的URL的似乎并不保存的cookies。 我必须从响应手动提取饼干和对我自己的要求重新发送它们或CookieManager将自动为我做到这一点? 如果CookieManager没有,那么它增加什么价值?

要测试的东西,我有我的每一个浏览器访问一个网址的时间成功计数器加一的servlet。 这工作得很好,从Safari浏览器,火狐和Chrome ......不过,我不能让它从一个独立的Java应用程序。

这里是一个非常简单的测试程序来说明什么,我希望将简单的工作。 它安装在开始的CookieManager,然后调用多次被评为网址是在控制台输入在获取(字符串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清晰地得到一个会话cookie从服务器返回。 但是,再次调用得到一个新的会话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和其他与请求重发呢?

Answer 1:

我运行代码并替换此

CookieHandler.setDefault(new CookieManager()); 

通过

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

这行得通!



文章来源: Should HttpURLConnection with CookieManager automatically handle session cookies?