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

6
我想在Spring MVC中使用@SessionAttributes注释,在两个控制器之间共享Session属性。
这是我用来测试属性共享的简单代码:
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)。
在两个控制器方法执行之前,该值是不共享的,每个控制器都会重新定义一个新值。
似乎如果一个控制器从未向SessionAttribute设置过值,则它不会检测到由另一个控制器设置的属性。
我真的希望能够在控制器之间共享会话属性,而不使用HttpSession对象并坚持使用Spring MVC 3对象。
我想知道是否有其他方法来在控制器之间共享会话数据,或者我是否遗漏了什么。
注:Web应用程序部署在Tomcat7服务器上。
1个回答

9
在Spring MVC中,@SessionAttributes不应该在多个控制器之间共享。
相反,我创建了一个具有Session作用域的对象(通过POJO),它保存了我需要存储为Session的所有值。
然后,我使用JDK动态代理将对象自动连接到控制器。

2
如果您能分享如何使用动态代理自动装配共享POJO,那将非常有帮助。 - Susitha Ravinda Senarath
1
@susithasenarath喜欢这个....@Component(value="registerBean") @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "request") - beinghuman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接