В настоящее время я разрабатываю приложение для Android, используя в качестве бэкенда App Engine. Поскольку происходит сильный анализ, мне иногда нужно передавать сессионные cookie-файлы с устройства Android на сервер для проверки подлинности при анализе данных ответа.
Приведенный ниже код взят со стороны сервера, где я помещаю файлы cookie, передаваемые с моего устройства Android, в объект сервера HttpUrlConnection. Теперь к моей проблеме.
У меня были огромные проблемы с тем, что я не прошел проверку подлинности, даже несмотря на то, что я передаю действительный файл cookie сеанса на сервер. После нескольких дней отладки кажется, что я нашел проблему сегодня, но я понятия не имею, как это исправить.
Используя сетевой монитор Microsoft, я вижу, что ИНОГДА, когда я делаю запрос с сервера, но не всегда, в запросе есть второй файл cookie, кроме того, который я добавил в HttpUrlConnection. Это, кажется, сбивает с толку сторонний сервер, который отвечает Set-cookie, а не дает мне доступ к защищенной странице.
Печенье выглядит так:
The cookie that I set
Cookie: PHPSESSID=q5r4uon05a32vhs29cd65sarv6
The second cookie, that just "appears" when I make the request
Cookie: $Version=0; PHPSESSID=hb94i7vopft13uaaob837lf3b0; $Path=/
Итак, что это за файл cookie версии 0 и как я могу убедиться, что он не передан в моем запросе?
ArrayList<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>();
URL page = null;
Scanner scanner = null;
Session session = null;
HttpURLConnection connection = null;
try {
link = link.replace("&", "&");
page = new URL(FS_PARTIAL_SESSION_URL + link);
StringBuilder sb = new StringBuilder();
Iterator<Cookie> cooks = cookies.iterator();
while(cooks.hasNext()) {
Cookie cookie = cooks.next();
sb.append(cookie.getName()+"="+cookie.getValue());
if (cooks.hasNext()) {
sb.append(";");
}
}
connection = (HttpURLConnection) page.openConnection();
connection.setRequestProperty("Cookie", sb.toString());
scanner = new Scanner(connection.getInputStream());
} catch (MalformedURLException e) {
log.log(Level.SEVERE, e.getMessage(), e);
} catch (IOException e) {
log.log(Level.SEVERE, e.getMessage(), e);
}
finally {
connection.disconnect();
}