【发布时间】:2011-10-09 07:05:22
【问题描述】:
我正在编写一个 Android 应用程序,它将用户名和密码提交给托管在 Google App Engine 上的 Java Servlet。我正在编写两个 Android 应用程序。和小服务程序。
用户名和密码被打包到设备上的 POST 请求中,servlet doPost() 方法检查这些值。如果用户名和密码正确,我会请求一个会话...如果它不存在则创建它:
HttpSession session = request.getSession(true);
在这个会话中,我存储了一个名称值对“logged”和“true”。
在 android 设备上返回一个 cookie 以及 200 OK 的 HTTP 状态。这一切看起来都很好,因为服务器上的会话是使用 cookie 实现的(对我来说是透明的,因为我只是使用会话 API)。
android 设备发出的所有后续 HTTP POST 将 cookie 打包到 HTTP POST 中,以便它可以请求 .jsp 页面或使用其他 servlet 检查会话中的“记录和”真“值(即受保护的页面) .
问题:即使没有运行以下代码,也会返回 cookie:
HttpSession session = request.getSession(true);
即用户名和密码是假的。这不是一个安全问题,因为从未设置“logged”和“true”名称值对,因此应用程序无法使用 .jsp 或其他 servlet。但是,我使用 cookie 从 POST 请求返回到设备这一事实作为身份验证成功的标志。
为什么即使我没有使用或请求使用会话,我也会得到一个 cookie?
我当前的解决方案是在 servlet 中创建一个额外的 cookie,并在设备上检查这个 cookie。但是,此 cookie 不是从设备打包到后续 POSTS 中的 cookie,因为它不是与包含“已记录”“真实”值的会话相关联的 cookie。这似乎很骇人听闻。显然我误解了什么。
【问题讨论】: