【问题标题】:grails - how create new session for different browser tabsgrails - 如何为不同的浏览器选项卡创建新会话
【发布时间】:2018-04-08 05:01:58
【问题描述】:

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

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

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

或者也许有办法获得浏览器标签 ID 之类的东西?

【问题讨论】:

    标签: session grails


    【解决方案1】:

    您似乎误解了会话的工作方式和分配方式。

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

    因此,即使您可以在控制器操作中创建新会话,它也无济于事,因为这将成为浏览器所有选项卡的会话,并且之前的会话将被无效/放弃。

    没有浏览器标签 ID 这样的东西。

    您需要解决导致数据关联基于浏览器会话的根本问题。让它基于别的东西。 (只是一般性建议,因为这不是您的问题的一部分,而且您没有提供任何详细信息。)

    【讨论】:

    • 在我的情况下,当用户单击一个按钮时,会生成部分数据,如果我们打开另一个选项卡,数据将在那里,但我需要以某种方式确定它是另一个选项卡,而不是显示以前的数据加载。我认为会话可以帮助我,但我错了。所以,我认为额外的 url 参数可能会有所帮助,但不确定。
    【解决方案2】:

    这是我对此的看法。

    你想要完成的事情可能看起来很简单,但你需要一些机制来捕获每个会话是谁,无论它是 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 时会发生什么,等等一个永远结束的循环,接下来会发生什么?

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

    无论哪种方式,上述所有问题都是一致的逻辑来确定他们是否已经看到了所有可能的选项,那么接下来呢?

    我认为你最好从不同的角度考虑它,因为它基于时间戳并移动查询或任何基于该时间戳随机生成不同输出的东西,因为它总是会改变与用户无关

    【讨论】:

    • 它实际上可能是为每个会话 ID 存储的增量,因此 session.visited=(session.visited?:0)+1 在每次点击控制器时更改渲染视图 = index${session.visited}" 然后打开 index0.gsp index1.gsp index2.gsp 等等,增量从 1 开始或以下页面从 0 开始作为基本示例
    猜你喜欢
    • 2014-05-19
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    相关资源
    最近更新 更多