【问题标题】:Java Servlet, Cookies and AndroidJava Servlet、Cookie 和 Android
【发布时间】: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。这似乎很骇人听闻。显然我误解了什么。

【问题讨论】:

    标签: android servlets cookies


    【解决方案1】:

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

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

    您的第二种 cookie 方法听起来确实有点 hacky。大概您的身份验证请求已经向设备发送了一些响应(如果正在发送 cookie,则必须如此)。您觉得使用 cookie 有什么好处,而只是在响应中发回一些状态消息是无法获得的?

    【讨论】:

    • 好的,问题是:如何在android设备上检查这个会话值?
    • 寻找JSESSIONID cookie。例如,我刚刚访问了一个应用引擎托管网站,浏览器发送了以下 cookie:JSESSIONID=JUZjj1sbyvsHf2Sa3OrD5Q;
    • @Jack - 啊,我现在明白了,您正在使用设备上存在的 cookie 来尝试确定登录是否成功。我以为你在做相反的事情。
    • @Jack - 好的,我修改了我的答案。基本上我建议只发回一些状态消息以响应身份验证请求,除非有某些原因你不能这样做。 JSON 的 sn-p 应该是您所需要的。
    • 好的。这似乎是明智的。因为即使有人在那里创建了自己的服务器并发回了 JSON,他们仍然无法访问安全的 JSP 或 servlet,因为会话不包含“记录的”“真”标志(正如我之前提到的)。我想我会使用 Google 的 GSON 库来解析 JSON,因为我以前使用过它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 2010-10-27
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    相关资源
    最近更新 更多