Я пытаюсь получить определенный cookie в клиенте Java путем создания ряда Запросов HTTP. Похоже, что я получаю допустимый cookie от сервера, но когда я отсылаю запрос в fnal URL с на вид допустимым cookie, я должен получить некоторые строки XML в ответе, но ответ является пробелом, потому что cookie является неправильным или делается недействительным, потому что сессия закрылась или другая проблема, которую я не могу выяснить. Cookie, розданный сервером, истекает в конце сессии.
Это кажется мне, cookie допустим, потому что, когда я делаю те же вызовы в Firefox, подобном cookie с тем же именем и запускающийся с 3, первых, те же буквы и той же длины хранятся в Firefox, также истекающем в конце сессии. Если я затем выполняю запрос к заключительному URL только с этим конкретным cookie, сохраненным в Firefox (удалил все другие cookie), xml приятно представляется на странице.
Какие-либо идеи о том, что я делаю неправильно в этой части кода? Еще одна вещь, когда я использую значение от очень похожего cookie, сгенерированного и сохраненного в Firefox в этой части кода, последний запрос, действительно дает обратную связь XML в ответе HTTP.
// Validate
url = new URL(URL_VALIDATE);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Cookie", cookie);
conn.connect();
String headerName = null;
for (int i = 1; (headerName = conn.getHeaderFieldKey(i)) != null; i++) {
if (headerName.equals("Set-Cookie")) {
if (conn.getHeaderField(i).startsWith("JSESSIONID")) {
cookie = conn.getHeaderField(i).substring(0, conn.getHeaderField(i).indexOf(";")).trim();
}
}
}
// Get the XML
url = new URL(URL_XML_TOTALS);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Cookie", cookie);
conn.connect();
// Get the response
StringBuffer answer = new StringBuffer();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
answer.append(line);
}
reader.close();
//Output the response
System.out.println(answer.toString())
Мне немного лень отлаживать ваш код, но вы можете позволить CookieHandler сделать тяжелую работу. Вот один, который я сделал ранее:
public class MyCookieHandler extends CookieHandler {
private final Map<String, List<String>> cookies =
new HashMap<String, List<String>>();
@Override public Map<String, List<String>> get(URI uri,
Map<String, List<String>> requestHeaders) throws IOException {
Map<String, List<String>> ret = new HashMap<String, List<String>>();
synchronized (cookies) {
List<String> store = cookies.get(uri.getHost());
if (store != null) {
store = Collections.unmodifiableList(store);
ret.put("Cookie", store);
}
}
return Collections.unmodifiableMap(ret);
}
@Override public void put(URI uri, Map<String, List<String>> responseHeaders)
throws IOException {
List<String> newCookies = responseHeaders.get("Set-Cookie");
if (newCookies != null) {
synchronized (cookies) {
List<String> store = cookies.get(uri.getHost());
if (store == null) {
store = new ArrayList<String>();
cookies.put(uri.getHost(), store);
}
store.addAll(newCookies);
}
}
}
}
CookieHandler
предполагает, что ваша обработка файлов cookie является глобальной для JVM; если вам нужны поточные клиентские сеансы или другая более сложная обработка транзакций, вам может быть лучше придерживаться ручного подхода.