HttpURLConnection with CookieManager是否应该自动处理会话cookie?
2022-09-01 12:43:10
我有一个Java应用程序(JDK 1.7.0_13),并且正在使用java.net.HttpURLConnection连接到一些基于servlet的服务,这些服务可以进行会话管理。我正在尝试弄清楚如何使用java.net.CookieManager来跟踪会话cookie。阅读文档,我得到的印象是,使用CookieHandler.setDefault(new CookieManager())安装CookieManager应该会导致cookie管理自动发生。但是,对同一URL的多个请求似乎不会保留cookie。我是否必须手动从响应中提取 Cookie 并自行在请求中重新发送它们,或者 CookieManager 会自动为我执行此操作?如果CookieManager没有,那么它增加了什么价值?
为了测试一下,我有一个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显然会从服务器返回会话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 并将其与请求一起重新发送?