Spring MVC 3.0 обращается к переменной сеанса - PullRequest
1 голос
/ 22 октября 2010

У меня следующая проблема, я настроил следующий класс, который должен храниться в сеансе.

<bean id="Users" class="com.doolloop.DlUser" scope="session">
<aop:scoped-proxy/>
</bean>

Тогда я в своем сервлете Dispatcher хотел бы получить доступ к этому пользователю класса и установить

@RequestMapping(value="/authenticate.do",method = RequestMethod.POST)
          public String sampleAuthentication(@Valid Person person, BindingResult result,
                  Map model,HttpServletRequest request){
                    ...... /some code
  HttpSession session = request.getSession();
          DlUser user = (DlUser) session.getAttribute("Users");
                  /// some uses for user object

}

Проблема в том, что я всегда получаю нулевое значение объекта пользователя.

Что я делаю не так?

Вторая проблема, я читал в статьях, что доступ к HttpSession не является потокобезопасным, как это можно сделать безопасным способом? Должно быть что-то вроде синглтона? Почему это не потокобезопасная операция?

Заранее спасибо.

Дэнни.

Ответы [ 2 ]

2 голосов
/ 22 октября 2010

Это особый случай, когда вы хотите внедрить bean-компонент с более короткой областью действия в bean-компонент с более длинной областью действия (то есть bean-объект с сессионной областью в bean-объект с одной областью действия)1003 *:

<bean id="yourSingletonBean"
    class="your.singleton.BeanClass">
    <lookup-method name="getDLUser" bean="Users"/>
</bean>

Вам нужно будет сделать свой синглтон-бин abstract и создать метод abstract public DLUser getDLUser()

Это, однако, не идеальное решение,Идея состоит в том, чтобы провести на сессии как можно меньше.Если вам не нужно хранить бин в сеансе, а только текущего пользователя, вы можете легко вызвать session.setAttribute(..) при входе пользователя в систему, а затем получить доступ к текущему пользователю с помощью session.getAttribute(..), при этом пользователь не будет биномвообще.

Способ, который я выбрал для текущего пользователя в своем приложении, заключается в создании пользовательской аннотации @SessionAttribute.См. этот вопрос о том, как этого достичь.

1 голос
/ 22 октября 2010

объекты в области «сеанс» не хранятся в сеансе, они доступны для сеанса через обычную парадигму прямого внедрения.Просто они привязаны к сессии.Итак, если вам нужно это сделать, вам нужно внедрить этот компонент в ваш контроллер.Прочитайте здесь для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...