【问题标题】:Is it possible to access Spring MVC annotated session vars across multiple controllers?是否可以跨多个控制器访问带有 Spring MVC 注释的会话变量?
【发布时间】:2010-10-14 14:51:06
【问题描述】:

我有一个运行 Spring 3.0 并使用 Spring-MVC 的 Web 应用程序。我有几个这样设置的控制器:

@Controller
@RequestMapping("/admin")
@SessionAttributes({"clientLogin", "selectTab", "user", "redirectUrl"})
public class AdminController {
...
}

@Controller
@SessionAttributes({"clientLogin", "selectTab", "user", "redirectUrl"})
public class PublicController {
....
}

我可以将带注释的变量添加到 ModelMap 中,例如

map.addAttribute("user", "Bob");

将变量保存在当前控制器中效果很好;我可以通过该控制器中的任何其他方法从 modelMap 访问 var。但是当用户在另一个控制器中点击页面时,即使在@SessionAttributes 中列出了相同的变量,它在第二个控制器中也不可用。

是否可以使用注释跨多个控制器访问这些带注释的变量?

【问题讨论】:

    标签: spring session spring-mvc controller session-variables


    【解决方案1】:

    不,这是不可能的——在我看来,SessionAttributes 的名字很糟糕。

    如果您想在不同的控制器之间共享这些属性,您可以使用以下命令将它们显式放入会话中:

    session.setAttribute()

    【讨论】:

    • 这是一个相关讨论的链接,您可能会觉得有趣:forum.springsource.org/showthread.php?t=77305
    • 这很有趣,谢谢。考虑到您遇到的麻烦(尽管它似乎已从 Spring 2.5 更改为 3.0),您是否还尝试使用 SessionAttributes?
    • 它们非常适合它们的设计目的——简单的请求-响应交互。如果你发现你在使用大量带有多个控制器的对话式流,那么 Spring MVC 并不是真的为此而设计的——你应该研究一下 Spring Webflow。
    【解决方案2】:

    你可以有一个父类 BaseController,它不需要是 @Controller 类,并在那里使用变量 @SessionAttibutes({"clientLogin", "selectTab", "user", "redirectUrl"})。请记住,这个类应该属于 MVC 的扫描包。然后当你需要在你的实际控制器中使用它时,如下所示。

    public String getAllDetails(@ModelAttributes("clientLogin") Client client){
        client.getName();
        return "somejsp";
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-07
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 2018-01-10
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多