【发布时间】:2014-05-02 17:25:56
【问题描述】:
我目前正在运行一个使用 java Spring 处理会话的应用程序。我有以下代码,它为我处理所有会话。
@RequestMapping(value = "/login", method = GET)
public @ResponseBody
UserCredentials startLoginProcess(HttpSession session)
{
//initiate session if none exists
}
@RequestMapping(value = "/login", method = POST)
@ResponseStatus(value = HttpStatus.OK)
public void login(@RequestBody UserCredentials user, HttpSession session)
{
//do login stuff
}
@RequestMapping(value = "/logout", method = GET)
@ResponseStatus(value = HttpStatus.OK)
public void logout(HttpSession session)
{
session.invalidate();
}
这里的关键是调用invalidate() 的注销。这应该将会话标记为无效。
但是,当使用同一会话在无效后进行调用时,服务器会发送一个带有 200 OK 的响应和一个新的 set-cookie 标头。相反,我希望抛出一个错误,例如 403 或其他说明 cookie 现在无效的东西。
有什么方法可以做到这一点?
更具体一点,如果不存在新会话,我希望登录 GET 调用来处理创建新会话,但如果会话无效,所有其他调用都应该抛出某种类型的错误。显然HttpSession 上没有isInvalid 方法。
【问题讨论】:
-
你的意思是说当用户调用
logout操作时你想验证会话是否有效如果有效你想继续logout否则sessionExpired? -
基本上,是的。长答案,如果会话无效,我希望在所有端点上都有一个
sessionExpired,但 GET /login 除外 -
通常会话检查可以在
if(session==null)进行,如果那是空重定向到sessionExpired页面。 -
那行不通,因为 spring 在会话到达我之前会自动将会话替换为有效会话。
-
当用户调用
logout操作时,您将会话分配为 null 并重定向到注销页面..
标签: java session spring-mvc spring-boot