当用户第一次访问 www.example.com 时,我如何检测客户端浏览器是否启用了 cookie,如果启用,则将 cookie 发送到客户端而不诉诸于发送重定向请求( HTTP 302 请求)?如果必须进行重定向,那么在不进行多次重定向或搜索引擎机器人不友好重定向的情况下发送 cookie 的最佳方式是什么?我的 Java 应用程序需要在访问者第一次访问 example.com 时非常快速地创建基于 cookie 的帐户。之后,后续访问将根据此 cookie 识别用户。
此解决方案不应基于 Javascript,因为如果禁用 JavaScript,它仍然需要工作。
最佳答案
首先 - 在您设置 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 是否会以任何有用的方式保留(例如,反 spy 软件程序可能每 30 分钟清除一次 cookie)。它甚至无法验证您是否能够设置下一个 cookie(特别是如果它在不同的子域上;或者用户可能已经要求 UA 提示输入每个 cookie,所以只是因为这个 cookie 被接受并不意味着下一个将被接受)。下次用户登录时可能会使用不同的浏览器(具有不同的设置),或者他们更改了此浏览器的安全设置,等等。
真的,我会以与客户端表单验证相同的方式来考虑这一点 - 能够在访问者尝试无法正常工作时警告他们是件好事,但你可以'真的依赖它是正确的。在这种情况下,您的最后一句话有点令人担忧 - 因为您说它需要 起作用。如果这个测试是错误的(即你认为你可以设置 cookie 但实际上你不能)会有什么后果?我并不是说您的网站需要在没有 cookie 的情况下工作,只是您需要意识到您的检查很可能会产生误报,您需要意识到这一点。
所以在这种情况下,我认为用 Javascript 进行检查可能会更好;如果某人禁用了 JS 和 cookie,他们将无法与大多数具有某种登录方式的网站进行交互。当您收到没有 cookie 的请求时,您必须发回“糟糕,看起来您的 cookie 已禁用页面”无论如何,因此如果跳过初始检查,这几乎不会破坏游戏。
关于java - 在 Java 应用程序中发送和检测 cookie 的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4679348/