如果我打开我正在处理的同一个浏览器(比如Firefox)的新标签页(或窗口),那么它将被服务器视为同一个客户端。
但是,如果我从其他浏览器(例如IE)打开相同的URL,则服务器无法将其识别为同一客户端。
那么,服务器如何在内部识别客户端?
如果我希望服务器即使从不同的浏览器中唯一地标识客户端(并且不将其视为新客户端),我该如何从Web服务器(使用Servlet)执行此操作?
答案 0 :(得分:3)
“如果我打开我正在处理的同一浏览器的新标签页(或窗口)(比如Firefox)”
你的前提不准确。
如果我使用同一浏览器的不同配置文件(FireFox或Chrome等),则会将其视为不同的会话。
这就是我的想法 - 我可以拥有不让服务器或网络服务看到我的其他个人资料的隐私。作为用户,我不会让您的应用程序跨越该查询行进入我的其他浏览器或配置文件。此外,FF,Chrome,Safari,IE等不会为其Cookie共享相同的存储架构。
当然,您可能会花费大量时间,尝试破解可在浏览器之间交换Cookie的桌面应用程序 - 但这样做无用,因为
您的时间会更好地用于行业接受和流行的做法。
但是,如果您的应用程序具有用户登录/身份验证,那么我希望您的应用程序能够识别我和我的历史记录,无论哪个PC,哪个配置文件或我所在的世界的哪个部分。
因此,您的问题的答案是 - 用户身份验证。
您不应该在服务器周围处理数据,以便在多台PC或浏览器“会话”中识别相同的会话ID。它变得结实,毛茸茸,笨拙。
不要重新发明轮子。使用OpenID或OAuth2。
OpenID-consumer的实现非常简单。虽然很简单,但实现openID的文献示例并不多。但谷歌已经在OAuth上提供了大量有用的文献。
Google Federated登录/ OAuth也非常有趣且易于实施。即使有GWT。
问题仍然存在 - 当我想要的是在多个“浏览器会话”之间共享会话时,为什么我要将此事与用户身份验证复杂化。原因是安全。即使它是内部公司申请。你认为你的经理会想知道公司里的任何人都可以伪装他们的会话。
当您深入了解项目时,您会意识到尝试逃离用户身份验证路径是没有意义的。没有必要鞭打你自己的安全会话认证框架。
答案 1 :(得分:2)
从技术上讲,这是不可能的。服务器通过在客户端上设置cookie来识别客户端,并且浏览器不共享其cookie(它们仅在选项卡之间共享它们,这就是您看到不同选项卡被视为同一客户端的原因)。您可以尝试通过IP地址进行识别,但是代理后面的所有客户端都会被错误地识别为同一客户端。 唯一识别客户端的任何其他方式都涉及从机器获取信息(例如MAC地址),出于安全原因,浏览器不允许这样做。