[英]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.