0

我正在研究 grails 应用程序。对于用户管理,我使用的是 Grails 的 Spring Security Core PlugIn。我想存储一些特定于当前登录用户的信息,直到用户保持登录状态,并且我希望这些信息在所有浏览器中都可用。我尝试使用基于范围的服务来访问它。所以我创建了一个服务:

class LoggedInUserSessionDataService {

    String searchParams
    String searchQuery

    //This service will get expire when loggedin user's session will expire
    static scope = 'session'
}

并在 resources.groovy 文件中为其代理:

loggedInUserSessionDataServiceProxy(org.springframework.aop.scope.ScopedProxyFactoryBean) {
    targetBeanName = 'loggedInUserSessionDataService'
    proxyTargetClass = true
}

然后在我的控制器中,我注入了这个代理:

def loggedInUserSessionDataServiceProxy

因此,毕竟,存储的信息仅可用于特定浏览器,并且当我尝试在其他浏览器中访问此信息时找不到,而在该浏览器中也应该可以访问。

请指导我如何实现这一目标?如果不可能通过基于范围的服务,那么还有什么其他选择?

PS 在同一个浏览器中 当用户保持登录状态时,存储的信息在同一个浏览器中仍然可用,这可以正常工作。

谢谢你的时间 :)

4

1 回答 1

0

当用户从另一个浏览器登录时,他们被分配了一个不同的会话,即使他们是作为同一个用户登录的。您需要以某种方式将两个会话链接在一起。

一种可能的解决方案是创建一个普通的单例服务FooService,其中包含一个数据结构Map<User, SessionData>,例如SessionData抽象会话保存数据的位置。它还将包含一个计数器;当用户登录时,您LoggedInUserSessionDataService将调用fooService.connectSession(user)这将返回现有SessionData实例或创建一个新实例并将其计数器增加 1。当会话结束时,该服务将调用fooService.disconnectSession(user)这将减少计数器。当计数器变为 0 时,您user从地图中删除密钥以重置该“会话”。

于 2014-12-08T11:43:35.977 回答