Java 使用CookieManager的HttpURLConnection是否应自动处理会话cookie?
我有一个Java应用程序(JDK1.7.0_13),我使用Java.net.HttpURLConnection连接到一些基于servlet的服务,这些服务进行会话管理。我正在尝试找出如何使用java.net.CookieManager跟踪会话cookies。阅读这些文档后,我得到的印象是,使用CookieHandler.setDefault(new CookieManager())安装CookieManager应该会自动进行cookie管理。但是,对同一URL的多个请求似乎不会保留cookie。我是否必须手动从响应中提取cookie并在请求中重新发送它们,还是CookieManager将自动为我执行此操作?如果CookieManager没有,那么它会增加什么价值 为了进行测试,我有一个servlet,它可以在每次浏览器访问URL时成功地增加一个计数器。这在Safari、FireFox和Chrome中运行良好。。。然而,我无法从一个独立的Java应用程序中让它工作 这里有一个非常简单的测试程序来说明我所希望的简单工作。它首先安装CookieManager,然后在控制台键入URL时重复调用fetch(String-urlString)方法Java 使用CookieManager的HttpURLConnection是否应自动处理会话cookie?,java,cookies,httpurlconnection,cookiemanager,Java,Cookies,Httpurlconnection,Cookiemanager,我有一个Java应用程序(JDK1.7.0_13),我使用Java.net.HttpURLConnection连接到一些基于servlet的服务,这些服务进行会话管理。我正在尝试找出如何使用java.net.CookieManager跟踪会话cookies。阅读这些文档后,我得到的印象是,使用CookieHandler.setDefault(new CookieManager())安装CookieManager应该会自动进行cookie管理。但是,对同一URL的多个请求似乎不会保留cookie。
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);
}
}
}
因此,总而言之,我是否需要做一些其他的事情来让CookieManager自动为我工作,或者我必须求助于从响应中手动提取cookie并用请求重新发送它们?我运行您的代码并替换它
CookieHandler.setDefault(new CookieManager());
借
成功了 谢谢。工作出色。当然,现在我知道了答案,文档很容易找到。;-)这是一个比你通常能找到的更好、更简洁的答案。谢谢这是自动将cookies添加到
CookieStore
还是必须编写cookieManager.getCookieStore().add(uri,hc)代码>每次hc
是一个HttpCookie对象
。这只适用于第一次使用。。当我重新启动应用程序时。。它给我错误BasicNetwork.performRequest:意外响应代码401。。请帮忙!请转到。已找到最佳解决方案
CookieHandler.setDefault(new CookieManager());
CookieHandler.setDefault( new CookieManager( null, CookiePolicy.ACCEPT_ALL ) );