Java Servlet,Cookies和Android

时间:2011-07-20 10:48:19

标签: android servlets cookies

我正在编写一个Android应用程序,它向Google App Engine上托管的Java Servlet提交用户名和密码。我正在编写Android应用程序。和Servlet。

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

HttpSession session = request.getSession(true);

在此会话中,我存储名称值对“已登录”和“真实”。

在Android设备上返回一个cookie,其状态为200 OK。这一切似乎都很好,因为服务器上的会话是使用cookie实现的(因为我只是使用会话API而对我透明)。

Android设备发出的所有后续HTTP POST将cookie打包到HTTP POST中,以便它可以请求.jsp页面或使用其他servlet检查会话中的“已记录和”真实“值(即受保护的页面)

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

HttpSession session = request.getSession(true);

即。用户名和密码均为false。这不是一个安全问题,因为永远不会设置“已登录”和“真实”名称值对,因此应用程序无法使用.jsp或其他servlet。但是,我使用的是从POST请求返回到设备的cookie,这表明身份验证成功。

即使我不使用或请求使用会话,为什么我会收到cookie?

我目前的解决方案是在servlet中创建一个额外的cookie,并在设备上检查此cookie。但是,此cookie不是从设备打包到后续POSTS中的cookie,因为它不是与包含“已记录”“true”值的会话关联的cookie。这看起来很丑陋。显然,我误解了一些事情。

1 个答案:

答案 0 :(得分:0)

大多数(或者所有)servlet容器总是为用户分配会话cookie(如果他们还没有会话cookie),无论是否显式提供的webapp请求会话。 Google App Engine在这方面没有什么不同。除了设备向服务器发出请求并收到一些响应之外,您不应该基于cookie的存在或不存在而假设任何事情。

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

你的第二个cookie方法肯定听起来有点hacky。据推测,您的身份验证请求已经将一些响应发送回设备(必须是,如果正在发送cookie)。如果您只是通过发送一些状态消息作为回复的一部分而使用不能获得的cookie,您会有什么感受?