我有以下问题,我已经配置了以下类,应该存储在会话中。
<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
不是线程安全的,如何以安全的方式完成?应该是一种单身人士?为什么这不是线程安全操作?
提前谢谢。
丹尼。
答案 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()
session.setAttribute(..)
,然后使用session.getAttribute(..)
访问当前用户,而无需用户完全是一个bean。
我在应用程序中为当前用户选择的方法是创建自定义@SessionAttribute
注释。请参阅this question了解如何实现这一目标。
答案 1 :(得分:1)
对象作用域“会话”在会话中没有存储,它们可通过常规直接注入范例用于会话。只是他们与会话联系在一起。因此,如果您需要使用此功能,则需要将此bean注入控制器。请阅读here了解详情。