gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:14:03 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com