我正在处理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。在同一个浏览器中,当用户保持登录状态时,存储的信息在同一浏览器中保持可用状态正常工作。
感谢您的时间:)
答案 0 :(得分:0)
当用户从其他浏览器登录时,即使他们以同一用户身份登录,也会为他们分配不同的会话。你需要以某种方式将两个会话链接在一起。
一种可能的解决方案是创建一个包含FooService
数据结构的普通单件服务Map<User, SessionData>
,其中SessionData
是您提取数据的抽象会话。它还包含一个柜台;当用户登录时,您的LoggedInUserSessionDataService
将调用fooService.connectSession(user)
,这将返回现有的SessionData
实例或创建一个新实例并将其计数器增加1.当会话结束时,该服务将调用fooService.disconnectSession(user)
会减少计数器。当计数器变为0时,您从地图中移除user
键以重置该会话&#39;。