代码之家  ›  专栏  ›  技术社区  ›  danny.lesnik

Spring MVC 3.0访问会话变量

  •  1
  • danny.lesnik  · 技术社区  · 15 年前

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

    <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 线程不安全,怎么做才能安全呢?应该是单身吗?为什么这不是线程安全操作?

    提前谢谢。

    丹尼。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    当您想将一个范围较短的bean注入到一个范围较长的bean(即会话范围的bean注入到一个单实例范围的bean)时,这是一种特殊情况。

    你可以使用 lookup-method :

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

    你得做你的独生子豆 abstract 创建一个 摘要 方法 public DLUser getDLUser()

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

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

        2
  •  1
  •   Anatoly G    15 年前

    对象作用域“session”不存储在session中,它们通过常规的直接注入范式可用于会话。只不过是他们的时间是有限的。所以,如果您需要这个可用的,您需要将这个bean注入到您的控制器中。读 here 更多信息。