Session grails-如何为不同的浏览器选项卡创建新会话

Session grails-如何为不同的浏览器选项卡创建新会话,session,grails,Session,Grails,我正在尝试使用grails创建简单的web应用程序 现在,我需要在用户在不同选项卡中打开同一页面时创建新会话,以避免在所有打开的选项卡中显示相同的数据 是否可以定义在新选项卡中打开的页面?如果可能,如何在控制器操作中创建新会话 或者,也许有一种方法可以获得类似浏览器选项卡id的内容?您似乎误解了会话的工作方式,并且分配了会话 每个浏览器(和域/主机)都有一个会话 因此,即使您可以在控制器操作中创建新会话,它也不会有帮助,因为该会话将成为浏览器所有选项卡的会话,并且上一个会话将无效/放弃 没有浏览

我正在尝试使用grails创建简单的web应用程序

现在,我需要在用户在不同选项卡中打开同一页面时创建新会话,以避免在所有打开的选项卡中显示相同的数据

是否可以定义在新选项卡中打开的页面?如果可能,如何在控制器操作中创建新会话


或者,也许有一种方法可以获得类似浏览器选项卡id的内容?

您似乎误解了会话的工作方式,并且分配了会话

每个浏览器(和域/主机)都有一个会话

因此,即使您可以在控制器操作中创建新会话,它也不会有帮助,因为该会话将成为浏览器所有选项卡的会话,并且上一个会话将无效/放弃

没有浏览器选项卡id这样的东西


您需要解决导致数据关联基于浏览器会话的根本问题。把它建立在其他的基础上。(这只是一个一般性的建议,因为这不是您的问题的一部分,您也没有提供任何详细信息。)

您似乎误解了会话的工作方式,并且分配了会话

每个浏览器(和域/主机)都有一个会话

因此,即使您可以在控制器操作中创建新会话,它也不会有帮助,因为该会话将成为浏览器所有选项卡的会话,并且上一个会话将无效/放弃

没有浏览器选项卡id这样的东西


您需要解决导致数据关联基于浏览器会话的根本问题。把它建立在其他的基础上。(这只是一个一般性的建议,因为这不是你问题的一部分,你也没有提供任何细节。)

以下是我对此的看法

您试图完成的可能看起来很简单,但您需要一些机制来捕获每个会话是谁,无论是spring安全用户名还是实际的http会话id,然后用它存储他们迄今为止访问过的控制器操作,并在反复检查的同时保持此操作的一致性更新。 简单到

[
['10001':[controller:'someController', 'someAction'],[controller:'someController1', 'someAction1'],
],
['10002':[controller:'someController', 'someAction'],[controller:'someController1', 'someAction1']
]
其中“10001”是您地图的密钥,是您的会话id,然后它包含一个访问过的地方的内部地图列表,您可以捕获这些地方并尝试确定它们是否已经在那里-这里的问题基本上是

AI在哪里说如果他们看到了一些动作1,他们应该看到动作2,当他们看到动作1和动作2时会发生什么,等等,一个永无止境的循环,接下来会发生什么

无论哪种方式,您都可以将所有这些作为包含上述映射的会话变量来完成—您将遇到的问题将是并发映射(同时更新和读取它)。 因此,您需要仔细研究使用并发哈希映射来解决这些问题

无论哪种方式,上述所有问题都是一致的逻辑,以确定他们是否看到了所有可能的选择,然后下一步该怎么办


我认为您最好从不同的角度来考虑它,比如基于时间戳并移动查询,或者基于该时间戳随机生成不同的输出,因为无论用户如何,这总是会发生变化

您试图完成的可能看起来很简单,但您需要一些机制来捕获每个会话是谁,无论是spring安全用户名还是实际的http会话id,然后用它存储他们迄今为止访问过的控制器操作,并在反复检查的同时保持此操作的一致性更新。 简单到

[
['10001':[controller:'someController', 'someAction'],[controller:'someController1', 'someAction1'],
],
['10002':[controller:'someController', 'someAction'],[controller:'someController1', 'someAction1']
]
其中“10001”是您地图的密钥,是您的会话id,然后它包含一个访问过的地方的内部地图列表,您可以捕获这些地方并尝试确定它们是否已经在那里-这里的问题基本上是

AI在哪里说如果他们看到了一些动作1,他们应该看到动作2,当他们看到动作1和动作2时会发生什么,等等,一个永无止境的循环,接下来会发生什么

无论哪种方式,您都可以将所有这些作为包含上述映射的会话变量来完成—您将遇到的问题将是并发映射(同时更新和读取它)。 因此,您需要仔细研究使用并发哈希映射来解决这些问题

无论哪种方式,上述所有问题都是一致的逻辑,以确定他们是否看到了所有可能的选择,然后下一步该怎么办


我认为您最好从不同的角度来考虑它,比如基于时间戳并移动查询,或者基于该时间戳随机生成不同的输出,因为在我的情况下,无论用户是谁,当用户单击一个按钮时,它总是会改变,生成的部分数据,如果我们打开另一个选项卡,数据将在那里,但我需要以某种方式确定这是另一个选项卡,而不是显示先前加载的数据。我原以为这会对我有所帮助,但我错了。所以,我认为额外的url参数可能会有所帮助,但不确定。在我的例子中,当用户单击按钮时,会生成部分数据,如果我们打开另一个选项卡,数据就会在那里,但我需要以某种方式确定这是另一个选项卡,而不是显示先前加载的数据。我原以为这会对我有所帮助,但我错了。因此,我认为额外的url参数可能会有所帮助,但不确定。它实际上可能是为每个会话id存储的增量,因此session.visted=(session.visted?:0)+1在每次点击控制器时,您可以在其中更改render view=“index${session.visted}”然后打开index0.gsp index1.gsp index2.gsp等等,上面和下面的增量从1开始,或者下面的增量从0开始,作为一个基本示例,它实际上可以是一个增量,存储在每个会话id中,所以session.visted=(session.visted?:0)+1,每次点击控制器,然后更改render view=“index${session.visted}”