0

我对基于注解的 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";
    }
}

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

基本上,当我在浏览器 URL 栏中输入此内容时,我会遇到相同的异常:

http://localhost:8080/Bonjour/admin

异常如下所示:

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

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

提前致谢,

马克斯

4

3 回答 3

0

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

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

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

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

于 2013-06-02T09:29:46.477 回答
0

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

于 2013-05-26T14:06:09.123 回答
0

我的错 - 我阻止了 cookie!

因此,除了 POST 请求之外,会话没有机会持续存在,因此登录有效,但同一页面的 GET 却没有......

于 2013-06-02T09:45:28.617 回答