0

Я работаю над применением Grails. Для управления пользователями я использую Spring Security Core Plugin от Grails. Я хочу сохранить некоторую информацию, которая будет специфичной только для пользователя в настоящее время loggedIn, который тоже до тех пор, пока пользователь не войдет в систему, и я хочу, чтобы эта информация была доступна во всех браузерах. Я попытался получить доступ к этому, используя службы на основе области. Так что я создал службу:Проблемы при использовании служб на основе Scope в Grails

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. В том же браузере Он отлично работает, что сохраненная информация остается доступной в том же браузере, пока пользователь остается loggedIn.

Спасибо за ваше время :)

+0

Что означает другой браузер: 1) «он работает в IE, но не в Chrome» или 2) «он работает в браузере, где пользователь вошел в систему, но затем я также вхожу в систему со вторым браузером и не могу видеть данные'? –

+0

Другим браузером означает браузер. Для примера User LoggedIn в Chrome и я храню некоторые данные в данных сеанса пользователя, и когда пользователь получает loggedIn в браузере Mozila, я не получаю данные, помещенные в объект сеанса –

ответ

0

Когда пользователь входит в систему с помощью другого браузера, они назначены разные сессии, несмотря на то, что они будут подписаны в качестве того же пользователя. Вам нужно как-то связать две сессии вместе.

Одним из возможных решений было бы создать обычную однопользовательскую службу FooService, содержащую структуру данных, такую ​​как Map<User, SessionData>, где SessionData - это ваши данные о проведенных сеансах. Он также будет содержать счетчик; когда пользователь войдет в систему, ваш LoggedInUserSessionDataService вызовет fooService.connectSession(user), который вернет существующий экземпляр SessionData или создаст новый и увеличит его счетчик на 1. Когда сеанс закончится, служба вызовет fooService.disconnectSession(user), который уменьшит счетчик. Когда счетчик достигнет 0, вы удалите ключ user с карты, чтобы сбросить эту «сессию».