Java 如何在不同的浏览器页面中管理多个帐户的登录和注销?
我有一个基于应用程序引擎(Java)的网站,需要用户使用谷歌帐户登录 情况是:Java 如何在不同的浏览器页面中管理多个帐户的登录和注销?,java,google-app-engine,login,authentication,Java,Google App Engine,Login,Authentication,我有一个基于应用程序引擎(Java)的网站,需要用户使用谷歌帐户登录 情况是: 用户Adam有多个帐户 用户Adam使用帐户Adam1登录,并在浏览器页面A中获取其Adam1数据 他点击了注销链接,但在另一个选项卡页面B中打开了它(当然是同一个浏览器) 他使用浏览器页面B中的另一个帐户Adam2登录,以显示他的Adam2数据 然后他返回浏览器页面A,对数据进行了一些更改,然后发送到服务器,此时我的应用程序将识别当前用户是Adam2,并且更改将在Adam2上进行,它的状态与其当前页面A不匹配,我们
处理这种情况的最佳做法是什么 在表单上放置一个隐藏字段,该字段是会话ID和用户ID的组合散列。当服务器处理请求时,请仔细检查随请求发送的组合散列是否符合您的预期。如果用户或会话出错,哈希将不匹配,您可以适当地报告错误。用户可能会通过作为Cookie信息发送的会话ID来识别。由于登录不同,站点A上的Adam将与站点B上的Adam具有不同的会话ID。另外,可能表单页面将受到保护,因此用户需要登录才能访问它 当Adam在页面B上注销时,旧会话在服务器上被破坏,登录无效。当Adam从页面A提交表单时,浏览器不知道发生了这种情况,将提交表单和旧会话ID。由于会话已过期,服务器将(应该)拒绝此提交
因此,在正确编码的会话/用户管理系统中,这是一个不存在的问题。关键点是在注销时更新/使会话ID无效。您可能会误解我的问题,没有站点A和站点B,只有浏览器为同一站点打开的两个页面。在用户关闭浏览器并尝试获取新会话之前,会话id不会更改。@virsir我确实理解您的问题,我使用的术语“a页”和“B页”与您在问题中使用的相同。我想说的是,当您注销时,会话id应该更改,这将使这个问题变得毫无意义。