如何在不同的浏览器页面中管理多个帐户登录和注销?
我有一个基于App Engine(Java)的网站,需要用户使用Google帐户登录。
情况是:
- 用户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。
- 工作线程导致Lucene LockObtainFailedException
- 使用GWT和GAE进行JUnit测试
- 使用Spring MultipartFile和谷歌应用引擎上传文件
- Google App Engine标准环境 – 未找到控制器方法 – Spring Boot应用程序
- 不应命名Cloud Endpoint参数
- Struts + GAE java.security.AccessControlException:struts2-core-2.3.15.3.jar的访问被拒绝
- 远程api gae祖先查询
- 在Google App Engine Java应用程序中加载自定义密钥库
- 会话超时(session.setMaxInactiveInterval)在Google Appengine中不起作用