在Grails中使用基于范围的服务时的问题

时间:2014-12-07 19:45:15

标签: session grails session-cookies session-scope grails-services

我正在处理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

所以,在所有这些之后,存储的信息只适用于特定浏览器,当我尝试在其他浏览器中访问此信息时,找不到它,而它也应该可以在该浏览器中访问。

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

P.S。在同一个浏览器中,当用户保持登录状态时,存储的信息在同一浏览器中保持可用状态正常工作。

感谢您的时间:)

1 个答案:

答案 0 :(得分:0)

当用户从其他浏览器登录时,即使他们以同一用户身份登录,也会为他们分配不同的会话。你需要以某种方式将两个会话链接在一起。

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