Spring MVC 3.0访问会话变量

时间:2010-10-22 00:27:41

标签: java spring servlets spring-mvc

我有以下问题,我已经配置了以下类,应该存储在会话中。

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

然后我在我的Dispatcher servlet中我想访问这个类用户并设置

@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

}

问题是我总是得到用户对象的null值。

我做错了什么?

第二个问题,我在文章中读到访问HttpSession不是线程安全的,如何以安全的方式完成?应该是一种单身人士?为什么这不是线程安全操作?

提前谢谢。

丹尼。

2 个答案:

答案 0 :(得分:2)

当你想要将具有较短范围的bean注入具有较长范围的bean(即会话范围的bean到单例范围的bean)时,这是一种特殊情况

您可以使用lookup-method

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

您需要制作单个bean abstract,并创建abstract方法public DLUser getDLUser()

然而,这并不是一个完美的解决方案。我们的想法是尽可能少地参加会议。如果您不需要在会话中存储bean,而只需要存储当前用户,则可以在用户登录时轻松调用session.setAttribute(..),然后使用session.getAttribute(..)访问当前用户,而无需用户完全是一个bean。

我在应用程序中为当前用户选择的方法是创建自定义@SessionAttribute注释。请参阅this question了解如何实现这一目标。

答案 1 :(得分:1)

对象作用域“会话”在会话中没有存储,它们可通过常规直接注入范例用于会话。只是他们与会话联系在一起。因此,如果您需要使用此功能,则需要将此bean注入控制器。请阅读here了解详情。