无法在会话中存储参数(Spring MVC)

时间:2013-05-26 10:02:33

标签: spring exception spring-mvc httpsession required

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

我有两个控制器(LoginController,AdminController),我可以将一个对象(类型为BonjourUser的loggedInUser)从LoginController传递给AdminController,方法是将它保存在会话中。到目前为止一切都很好。

为防止热链接,在初始“GET”上,AdminController会在调用时验证它是否收到了有效的admin-user。 这在第一次运行时效果很好,因为loginController将对象添加到会话中。

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

所以这是代码:

的LoginController:

@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";
    }
}

AdminController:

@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>

Basicaly当我在浏览器URL-bar中输入此内容时,我得到相同的异常:

http://localhost:8080/Bonjour/admin

例外情况如下:

org.springframework.web.HttpSessionRequiredException: Expected session attribute 'loggedInUser'

那么我需要更改什么以确保不会从会话中删除用户对象(loggedInUser)?

提前致谢,

Maex

3 个答案:

答案 0 :(得分:0)

将Spring更新到最新版本,它应该可以工作。请参阅此答案的评论:https://stackoverflow.com/a/9412890/1981720

答案 1 :(得分:0)

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

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

我从登录传递给管理员: 对象完美地存储在会话中 - &gt;属性图。

我使用链接或重新输入网址以再次访问同一页面: 在会话中不再有任何对象 - &gt;属性图。

答案 2 :(得分:0)

我的坏 - 我阻止了饼干!

因此会话没有机会被保留,除了POST请求,因此登录工作但同一页面的GET没有...