android - Java Servlet、Cookie 和 Android

标签 android servlets cookies

我正在编写一个 Android 应用程序,它将用户名和密码提交给托管在 Google App Engine 上的 Java Servlet。我正在编写这两个 Android 应用程序。和服务小程序。

用户名和密码被打包到设备上的 POST 请求中,servlet doPost() 方法检查这些值。如果用户名和密码正确,我请求一个 session ...如果它不存在则创建它:

HttpSession session = request.getSession(true);

在此 session 中,我存储了一个名称值对“logged”和“true”。

回到 android 设备上,将返回一个 cookie 以及 200 OK 的 HTTP 状态。这一切看起来都很好,因为服务器上的 session 是使用 cookie 实现的(对我来说是透明的,因为我只使用 session API)。

Android 设备进行的所有后续 HTTP POST 将 cookie 打包到 HTTP POST 中,以便它可以请求 .jsp 页面或使用其他 servlet 检查 session 中的“记录”和“真实”值(即 protected 页面) .

问题:即使未运行以下代码,也会返回 cookie:

HttpSession session = request.getSession(true);

即用户名和密码是假的。这不是一个安全问题,因为从未设置“logged”和“true”名称值对,因此应用程序无法使用 .jsp 或其他 servlet。但是,我使用的事实是 cookie 已从 POST 请求返回到设备作为身份验证成功的标志。

即使我没有使用或请求使用 session ,为什么我会收到 cookie?

我目前的解决方案是在 servlet 中创建一个额外的 cookie,并在设备上检查这个 cookie。但是,此 cookie 不是从设备打包到后续 POST 中的 cookie,因为它不是与包含“记录的”“真”值的 session 关联的 cookie。这看起来很老套。显然我误解了什么。

最佳答案

大多数(或可能是所有)servlet 容器都会总是为用户分配一个 session cookie,如果它们还没有 session cookie,无论所服务的 webapp 是否明确请求 session 。 Google App Engine 在这方面也不异常(exception)。除了设备已向服务器发出请求并收到一些响应之外,您不应仅基于 cookie 的存在或不存在来假设任何事情。

如果您想验证设备上的登录是否成功,为什么不直接发回一个它可以轻松解析的登录请求响应。例如,像 {"status": "success"} 这样的简单 JSON fragment 就可以了,或者甚至只是文字文本字符串“success”。

您的第二种 cookie 方法听起来确实有点老套。大概您的身份验证请求已经将一些响应发送回设备(如果正在发送 cookie,则必须如此)。您觉得通过使用 cookie 获得的好处是什么,而您只是通过将一些状态消息作为响应的一部分发回而得不到?

关于android - Java Servlet、Cookie 和 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6760689/

相关文章:

java - 成功登录并没有给我访问其他页面所需的 cookie(使用 Jsoup)

perl - Mojo::CookieJar - 如何从文件加载 cookie

android - 解析数据时出错 - 字符串无法转换为 JSONObject

java - 无法让 Glassfish 使用版本 7 编译 JSP

java - 如何获取返回结果的服务器的数据,我想获取该结果以更新到另一台服务器

jquery - 如何在用户浏览器中保存大量数据?

安卓工作室 : Gradle build Error:169. 254/16|*.169.254/16。将忽略这些主机的代理设置

java - 使用自定义字体时出现问题 - "native typeface cannot be made"

Android 不被识别为内部或外部命令 - 路径变量

tomcat - 如何将我的 Spring 申请展示到互联网上?