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


问题内容

我想使用@SessionAttributes批注在Spring MVC中共享两个控制器之间的Session Attributes。

这是我用来测试属性共享的简单代码: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);
}

}

a.jsp

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

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);
}

}

b.jsp

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

我期望的行为是转到/ 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服务器上。


问题答案:

在Spring MVC中,@ SessionAttributes不能跨控制器共享。

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

然后,我使用JDK动态代理将对象自动连接到控制器。