can';t在会话中存储参数(Spring MVC)

can';t在会话中存储参数(Spring MVC),spring,exception,spring-mvc,httpsession,required,Spring,Exception,Spring Mvc,Httpsession,Required,基于注释的Spring MVC存在以下问题: 我有两个控制器(LoginController、AdminController),我可以通过在会话中持久化一个对象(类型为BonjourUser的loggedInUser),将它从LoginController传递给AdminController。到目前为止还不错 为了防止热链接,在初始“GET”时,AdminController会验证调用它时是否收到了有效的管理员用户。 这在第一次工作正常,因为loginController将对象添加到会话中 现在

基于注释的Spring MVC存在以下问题:

我有两个控制器(LoginController、AdminController),我可以通过在会话中持久化一个对象(类型为BonjourUser的loggedInUser),将它从LoginController传递给AdminController。到目前为止还不错

为了防止热链接,在初始“GET”时,AdminController会验证调用它时是否收到了有效的管理员用户。 这在第一次工作正常,因为loginController将对象添加到会话中

现在我的问题来了: 一旦管理员登录并尝试重新访问管理员页面(例如通过JSP中的链接),用户对象似乎已经从会话中消失,因为我得到了“loggedInUser”属性的HttpSessionRequiredException。 AFAIK除非我在会话上调用setComplete(),否则不应从会话中删除该对象。(我没有调用这个方法!)那么为什么要从会话中删除该属性呢?我了解到您无法在控制器之间传递会话属性。但据说这是可能的。我还认为它应该可以工作,因为当我从LoginController重定向到AdminController时,我已经在控制器之间传递了一个参数

下面是代码:

登录控制器:

@Controller
@SessionAttributes("loggedInUser")
public class LoginController extends BonjourController
{
    [...]

    @RequestMapping(value = {"/home"}, method = RequestMethod.POST)
    public String validate(@ModelAttribute(value = "command") BonjourUser user, ModelMap map, HttpSession session)
    {
        [...]
        map.addAttribute("loggedInUser", loggedInUser);

        [...]
        return "redirect:/admin";
    }
}
@Controller
@RequestMapping(value = "/admin")
@SessionAttributes("loggedInUser")
public class AdminController extends BonjourController
{
    @RequestMapping(method = RequestMethod.GET)
    public String loginAdmin(@ModelAttribute("loggedInUser") BonjourUser loggedInUser, ModelMap map, HttpSession session)
    {
        //check if access is authorized
        if(loggedInUser == null)
        {
            return "redirect:/login";
        }

        [...]
    }
}
和管理员控制器:

@Controller
@SessionAttributes("loggedInUser")
public class LoginController extends BonjourController
{
    [...]

    @RequestMapping(value = {"/home"}, method = RequestMethod.POST)
    public String validate(@ModelAttribute(value = "command") BonjourUser user, ModelMap map, HttpSession session)
    {
        [...]
        map.addAttribute("loggedInUser", loggedInUser);

        [...]
        return "redirect:/admin";
    }
}
@Controller
@RequestMapping(value = "/admin")
@SessionAttributes("loggedInUser")
public class AdminController extends BonjourController
{
    @RequestMapping(method = RequestMethod.GET)
    public String loginAdmin(@ModelAttribute("loggedInUser") BonjourUser loggedInUser, ModelMap map, HttpSession session)
    {
        //check if access is authorized
        if(loggedInUser == null)
        {
            return "redirect:/login";
        }

        [...]
    }
}
我在管理员jsp中使用的链接(导致异常)如下所示

<a href="admin">Once more to admin section</a>
例外情况如下所示:

org.springframework.web.HttpSessionRequiredException: Expected session attribute 'loggedInUser'
那么,我需要做哪些更改以确保用户对象(loggedInUser)不会从会话中删除

提前感谢,


Maex将Spring更新到最新版本,它应该可以工作。请参阅对此答案的评论:

我现在尝试了3种不同版本的spring: 3.1.1 3.2.2 3.2.3

总是一样的问题。调试器告诉我:

我从登录传递到管理员: 对象完全存储在会话->属性映射中

我使用链接或重新键入url再次访问同一页面:
会话->属性映射中不再有对象。

我的坏-我阻止了Cookie

因此,除了POST请求外,会话没有机会被持久化,因此登录工作正常,但同一页面的GET没有