基于注释的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
答案 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没有...