在java应用程序中发送和检测cookie的最佳方法是什么?

时间:2011-01-13 11:05:14

标签: java http cookies

当用户第一次访问www.example.com时,如何检测客户端浏览器是否启用了Cookie,如果是,则将cookie发送到客户端而不诉诸发送重定向请求(HTTP 302请求) )?如果必须进行重定向,那么在不进行多重重定向或搜索引擎机器人不友好重定向的情况下发送cookie的最佳方式是什么?我的java应用程序需要在访问者第一次访问example.com时非常快速地创建基于cookie的帐户。之后的访问将基于此cookie识别用户。

此解决方案不应基于Javascript,因为如果禁用JavaScript,它仍然需要工作。

1 个答案:

答案 0 :(得分:2)

首先 - 在你设置cookie之前,不可能(明确地)告诉客户端是否支持cookie。如果您正在执行此服务器端,因为cookie是作为HTTP请求的一部分发送的,您将 发出某种重定向来进行此检查:

   client                  server
1a. GET index.html ---->
1b.            <------------ sets a cookie, redirect to index.html?foo=bar
2. GET index.html?foo=bar -->

使用Javascript可以让你解决这个问题,因为你至少可以查询cookie是否在客户端设置而不需要客户端发出另一个请求 - 但正如你所说的那样它是Javascript。

请注意,这种检查并不完全健壮;它并没有真正验证cookie会以任何有用的方式存在(例如,反间谍软件程序可能每30分钟清除一次cookie)。它甚至没有验证你是否能够设置下一个cookie(特别是如果它在不同的子域上;或者用户可能已经要求UA提示每个cookie,所以只是因为这个接受cookie并不意味着下一个将是)。并且用户下次登录时可能来自不同的浏览器(具有不同的设置),或者他们更改了此安全设置等等。

真的,我会以与客户端表单验证相同的方式来考虑这一点 - 当他们尝试的东西不能正常工作时能够警告访问者,这很好,但你可以'真的依赖是正确的。在这种情况下,你的最后一句话有点令人担忧 - 因为你说需要才能工作。如果此测试错误会导致什么后果(即您认为可以设置cookie,但实际上却不能)?我并不是说你的网站需要在没有cookie的情况下工作,只是你需要意识到你的检查可能会产生误报,你需要意识到这一点。

所以在这种情况下,我会说 可能更好地在Javascript中进行检查;如果有人禁用了JS cookie,他们将无法与大多数具有某种登录功能的网站进行交互。当您收到没有cookie的请求时,您必须发回“Ooops,看起来您已禁用cookie”无论如何,因此如果跳过初始检查,它几乎不会破坏游戏。