Должен ли HttpURLConnection с CookieManager автоматически обрабатывать сеансовые куки?
У меня есть приложение Java (JDK 1.7.0_13), и я использую java.net.HttpURLConnection для подключения к некоторым службам на основе сервлетов, которые выполняют управление сеансами. Я пытаюсь выяснить, как использовать java.net.CookieManager для отслеживания сеансовых файлов cookie. Читая документы, у меня складывается впечатление, что установка CookieManager с CookieHandler.setDefault (новый CookieManager ()) должна привести к автоматическому управлению cookie. Однако несколько запросов на один и тот же URL, похоже, не сохраняют файлы cookie. Нужно ли мне вручную извлекать файлы cookie из ответов и повторно отправлять их в запросах, или CookieManager собирается сделать это для меня автоматически? Если CookieManager этого не делает, то какое значение он добавляет?
Для проверки у меня есть сервлет, который успешно увеличивает счетчик каждый раз, когда мой браузер посещает URL. Это прекрасно работает с Safari, FireFox и Chrome ... Однако я не могу заставить его работать из автономного Java-приложения.
Вот очень простая тестовая программа, чтобы проиллюстрировать то, что, как я надеялся, будет работать просто. Он устанавливает CookieManager в начале, а затем повторно вызывает метод fetch (String urlString), когда URL-адреса вводятся в консоли.
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);
}
}
}
Вызов моего сервлета из этого приложения явно возвращает сессионный 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 из ответов и повторной отправке их с запросами?