2010-10-22 109 views
1

我有以下问题,我配置了以下应该存储在会话中的类。Spring MVC 3.0访问会话变量

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

然后我在调度员的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不是线程安全的,它怎么能做到安全呢?应该是种Singleton?为什么这不是线程安全操作?

预先感谢您。

Danny。

回答

2

当你想用较短的范围豆注入具有较长的范围豆这是一个特殊的情况下(即会话作用域的bean到一个单作用域的bean)

您可以使用lookup-method

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

你需要让你的单身豆abstract,并创建一个abstract方法public DLUser getDLUser()

然而,这是不是一个完美的解决方案。这个想法是尽可能少地举行会议。如果您不需要在会话中存储bean,但只有当前用户,则可以在用户登录时轻松地呼叫session.setAttribute(..),然后使用session.getAttribute(..)访问当前用户,而用户根本不是bean。

我在应用程序中为当前用户选择的一种方法是创建自定义@SessionAttribute注释。见this question如何实现。

1

对象作用域“会话”没有在会话中存储,它们通过常规直接注入范例可用于会话。只是他们是会话绑定的。所以,如果你需要这个可用的,你需要将这个bean注入到你的控制器中。有关更多信息,请阅读here

+0

这是否意味着这个bean将存在与Http会话存在相同的时间? – 2010-10-23 23:17:14

+0

是的,这是正确的,但请阅读Bozho的答案。如果你将这个bean注入一个更长寿的bean,效果将不会像你期望的那样。你最好使用session.getAttribute()来获取对象,或者使用AOP为会话对象进行代理 - 请看这里的例子以获取更多细节:http://wheelersoftware.com/articles/spring-session-scoped -beans.html。本质上,这个链接解释了如何为会话范围的bean创建一个代理,所以代理就是获得匹配会话内容的正确实例的代理 – 2010-10-24 00:42:27