繁体   English   中英

Spring MVC 3.0访问会话变量

[英]Spring MVC 3.0 accessing Session Variable

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

<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

}

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

我究竟做错了什么?

第二个问题,我在文章中读到,访问HttpSession不是线程安全的,如何安全地进行呢? 应该是单例吗? 为什么这不是线程安全操作?

先感谢您。

丹尼。

当您想将范围较短的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.setAttribute(..)访问当前用户session.getAttribute(..) ,而用户根本就不是Bean。

我为应用程序中的当前用户选择的一种方法是创建自定义@SessionAttribute批注。 有关如何实现这一目标,请参见此问题

作用域“会话”的对象不在会话中存储,它们可通过常规直接注入范例供会话使用。 只是他们是会话绑定的。 因此,如果需要此功能,则需要将此bean注入控制器中。 在这里阅读更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM