如何在Spring MVC中的控制器之间共享SessionAttributes?

Mou*_*Reg 5 session attributes spring-mvc

我想使用@SessionAttributes注释在Spring MVC中的两个控制器之间共享会话属性.

这是一个用于测试属性共享的简单代码:AController.java

@Controller
@SessionAttributes("myParam")
public class AController {

@RequestMapping(value="/a")
public String handle(Model model){

    if(!model.containsAttribute("myParam"))
        model.addAttribute("myParam", randomInt());

    return "a";
}

private int randomInt(){
    return new Random().nextInt(100);
}

}
Run Code Online (Sandbox Code Playgroud)

a.jsp

<%@taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<html>
<h1>Page A</h1>
<p>Param = ${myParam}</p>
</html>
Run Code Online (Sandbox Code Playgroud)

BController.java

@Controller
@SessionAttributes("myParam")
public class BController {

@RequestMapping(value="/b")
public String handle(Model model){

    if(!model.containsAttribute("myParam"))
        model.addAttribute("myParam", randomInt());

    return "b";
}

private int randomInt(){
    return new Random().nextInt(100);
}

}
Run Code Online (Sandbox Code Playgroud)

b.jsp

<%@taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<html>
<h1>Page B</h1>
<p>Param = ${myParam}</p>
Run Code Online (Sandbox Code Playgroud)

我期望的行为是转到/ a URL,myParam将被设置为0到99之间的随机值,然后这个值将在两个控制器之间共享.

但是,会发生以下情况:我转到/ a URL,myParam设置为一个值(比方说10).然后我转到/ b URL,myParam设置为另一个值(假设为20).当我回到/ a URL时,myParam值是BController设置的值(myParam = 20).

一旦执行了两个控制器方法,就会共享该值,但在此之前,每个控制器都会重新定义一个新值.

似乎Controller从未为SessionAttribute设置值,如果它是由另一个Controller设置的,则它不检测该属性.

我真的希望能够在不使用HttpSession对象并坚持使用Spring MVC 3对象的情况下共享控制器之间的会话属性.

我想知道我是否遗漏了某些内容,或者是否有其他做法可以在控制器之间的会话中共享数据.

注意:webapp部署在Tomcat7服务器上.

Mou*_*Reg 7

在Spring MVC中,@ SessionAttributes并不意味着与控制器共享.

我所做的是创建一个具有Session范围的对象(通过POJO),该范围包含我需要为Session存储的所有值.

然后,我使用JDK动态代理将对象自动装配到控制器.

  • 如果您可以分享如何使用动态代理自动装配共享POJO,将会很有帮助. (2认同)