0

我正在使用grails应用程序。对于用户管理,我正在使用Grails的Spring Security核心插件。我想存储一些特定于刚刚登录的用户的信息,直到用户保持登录状态,我希望在所有浏览器中都可以使用这些信息。我试图使用基于范围的服务来访问这个。在resources.groovy文件在Grails中使用基于范围的服务时的问题

class LoggedInUserSessionDataService { 

    String searchParams 
    String searchQuery 

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

和代理吧:所以我创建了一个服务

loggedInUserSessionDataServiceProxy(org.springframework.aop.scope.ScopedProxyFactoryBean) { 
    targetBeanName = 'loggedInUserSessionDataService' 
    proxyTargetClass = true 
} 
在我的控制器

然后,我注入这个代理:

def loggedInUserSessionDataServiceProxy 

于是,经过所有这一切,只有特定浏览器才提供存储的信息,并且当我尝试在其他浏览器中访问此信息时,该信息不会被发现,但它也应该可以在该浏览器中访问。

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

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

感谢您的时间:)

+0

另一个浏览器是什么意思:1)'它在IE中可用,但不在Chrome中'或2)'它在用户登录的浏览器中工作,但我也使用第二个浏览器登录,无法看到数据'? – 2014-12-08 09:34:11

+0

另一种浏览器意味着跨浏览器。对于Chrome用户登录的示例,我将一些数据存储在用户的会话数据中,并且当用户在Mozila浏览器中登录后,我不会将数据放入会话对象 – 2014-12-08 09:54:56

回答

0

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

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