Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不同的浏览器页面中管理多个帐户的登录和注销?_Java_Google App Engine_Login_Authentication - Fatal编程技术网

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不匹配,我们

我有一个基于应用程序引擎(Java)的网站,需要用户使用谷歌帐户登录

情况是:

  • 用户Adam有多个帐户
  • 用户Adam使用帐户Adam1登录,并在浏览器页面A中获取其Adam1数据
  • 他点击了注销链接,但在另一个选项卡页面B中打开了它(当然是同一个浏览器)
  • 他使用浏览器页面B中的另一个帐户Adam2登录,以显示他的Adam2数据
  • 然后他返回浏览器页面A,对数据进行了一些更改,然后发送到服务器,此时我的应用程序将识别当前用户是Adam2,并且更改将在Adam2上进行,它的状态与其当前页面A不匹配,我们的用户可能会感到困惑
  • 我想也许我可以在向服务器发出更改请求时附加一个userID参数,服务器端会将当前用户id与此userID参数进行比较,以使更改请求得到处理,或者返回一个刷新命令,以便在id不相同的情况下将过期页面刷新到当前帐户的页面


    处理这种情况的最佳做法是什么

    在表单上放置一个隐藏字段,该字段是会话ID和用户ID的组合散列。当服务器处理请求时,请仔细检查随请求发送的组合散列是否符合您的预期。如果用户或会话出错,哈希将不匹配,您可以适当地报告错误。

    用户可能会通过作为Cookie信息发送的会话ID来识别。由于登录不同,站点A上的Adam将与站点B上的Adam具有不同的会话ID。另外,可能表单页面将受到保护,因此用户需要登录才能访问它

    当Adam在页面B上注销时,旧会话在服务器上被破坏,登录无效。当Adam从页面A提交表单时,浏览器不知道发生了这种情况,将提交表单和旧会话ID。由于会话已过期,服务器将(应该)拒绝此提交


    因此,在正确编码的会话/用户管理系统中,这是一个不存在的问题。关键点是在注销时更新/使会话ID无效。

    您可能会误解我的问题,没有站点A和站点B,只有浏览器为同一站点打开的两个页面。在用户关闭浏览器并尝试获取新会话之前,会话id不会更改。@virsir我确实理解您的问题,我使用的术语“a页”和“B页”与您在问题中使用的相同。我想说的是,当您注销时,会话id应该更改,这将使这个问题变得毫无意义。