我目前正在Android上开发一个应用程序,使用App Engine作为后端。由于进行了一些繁重的解析,我有时需要将会话cookie从android设备传递到服务器,以便在解析响应数据时进行身份验证。
下面的代码来自服务器端,我在服务器HttpUrlConnection对象中放置了从我的android设备传递的Cookie。现在我的问题。
即使我将有效的会话cookie传递给服务器,我仍然遇到了未经过身份验证的巨大问题。经过几天的调试,似乎我今天发现了这个问题,但我不清楚如何解决这个问题。
使用Microsoft网络监视器,当我从服务器发出请求时,我可以看到SOMETIMES,但并非总是如此,请求中有第二个cookie,BESIDES是我放在HttpUrlConnection中的那个。这似乎混淆了第三方服务器,它使用Set-cookie进行响应,而不是让我访问安全页面。
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=/
那么,这个版本0的cookie是什么,我怎样才能确保它没有在我的请求中传递?
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();
}
答案 0 :(得分:0)
我终于通过创建自己的“版本0”cookie来解决这个问题。这样做似乎第二个cookie没有被创建,或者至少我自己的cookie被取而代之。所以在我的while循环中,代码现在看起来像这样:
Cookie cookie = cooks.next();
sb.append("$Version=0; ");
sb.append(cookie.getName()+"="+cookie.getValue());
if (cooks.hasNext()) {
sb.append(";");
}
sb.append("; $Path=/");