我对基于注解的 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)?
提前致谢,
马克斯