【发布时间】:2018-04-08 05:01:58
【问题描述】:
我正在尝试使用 grails 创建简单的网络应用程序。
现在,当用户在不同选项卡中打开同一页面时,我需要创建新会话以避免在所有打开的选项卡中显示相同的数据。
是否可以定义在新标签页中打开的页面?如果可能的话,如何在控制器操作中创建新会话?
或者也许有办法获得浏览器标签 ID 之类的东西?
【问题讨论】:
我正在尝试使用 grails 创建简单的网络应用程序。
现在,当用户在不同选项卡中打开同一页面时,我需要创建新会话以避免在所有打开的选项卡中显示相同的数据。
是否可以定义在新标签页中打开的页面?如果可能的话,如何在控制器操作中创建新会话?
或者也许有办法获得浏览器标签 ID 之类的东西?
【问题讨论】:
您似乎误解了会话的工作方式和分配方式。
每个浏览器(和域/主机)都有一个会话。
因此,即使您可以在控制器操作中创建新会话,它也无济于事,因为这将成为浏览器所有选项卡的会话,并且之前的会话将被无效/放弃。
没有浏览器标签 ID 这样的东西。
您需要解决导致数据关联基于浏览器会话的根本问题。让它基于别的东西。 (只是一般性建议,因为这不是您的问题的一部分,而且您没有提供任何详细信息。)
【讨论】:
这是我对此的看法。
你想要完成的事情可能看起来很简单,但你需要一些机制来捕获每个会话是谁,无论它是 Spring Security 用户名还是实际的 http 会话 ID,然后存储他们到目前为止访问过的控制器操作并在一遍又一遍地检查时保持一致更新。 像
这样简单的东西[
['10001':[controller:'someController', 'someAction'],[controller:'someController1', 'someAction1'],
],
['10002':[controller:'someController', 'someAction'],[controller:'someController1', 'someAction1']
]
其中“10001”是您的地图键并且是您的会话 ID,然后它包含您捕获的访问过的地方的内部地图列表,并尝试计算它们是否已经存在 - 基本上这里的问题是.. ..
AI 在哪里说如果他们看到了 someAction1,他们应该看到 action2,当他们看到 action1 和 action2 时会发生什么,等等一个永远结束的循环,接下来会发生什么?
无论哪种方式,您都可以将所有这些操作作为包含上述映射的会话变量 - 您将遇到的问题将是并发映射(它会同时更新和读取)。 因此,您需要仔细研究并使用并发哈希图来解决此类问题。
无论哪种方式,上述所有问题都是一致的逻辑来确定他们是否已经看到了所有可能的选项,那么接下来呢?
我认为你最好从不同的角度考虑它,因为它基于时间戳并移动查询或任何基于该时间戳随机生成不同输出的东西,因为它总是会改变与用户无关
【讨论】: