Spring - 删除 JSESSIONID cookie 时 HttpServletRequest 对象为空?



我正在我的 Web 应用程序中测试一项新功能,即使在浏览会话过期后,我允许用户保持登录状态。 为了实现这一点,我在登录页面上有一个"保持登录状态"复选框。 成功登录后,将创建一个包含用户 ID 的 cookie,登录过程将继续正常进行。 我的主控制器中的第一种方法做的第一件事是检查该cookie是否存在,读取其中的userId,在会话中正确设置User对象并绕过登录过程,直接进入主页。 当用户注销时,将重新创建过期为 0 的 Cookie,这意味着它会自动删除。

我的春季课程目前持续30分钟。 我已经成功测试了所有内容,但我正在尝试复制即将过期的 Spring 会话,这会删除内存中的 User 对象,并且通常会强制用户登录。 为了复制它,我正在从Chrome中删除JSESSIONID cookie。 当我这样做时,HttpServletRequest 对象(我正在检查 cookie)为空。

这是我的主控制器中运行的第一个代码:

@RequestMapping(value = {"/"}, method = RequestMethod.GET)
public String home(ModelMap model, HttpServletRequest request) 
{
if (session.getAttribute("loggedInUser") != null)
{
return "home";
}
else
{
String userId = null;
for (Cookie cookie : request.getCookies())
{
if (cookie.getName().compareTo("MDHISStaySignedIn") == 0)
{
userId = cookie.getValue();
break;
}
}
if (userId != null)
{
session.setAttribute("loggedInUser", userService.findByUserId(userId));
return "redirect:/";
}
else
{
model.addAttribute("login", new Login());
model.addAttribute("register", new Register());
model.addAttribute("registering", false);
return "login";
}
}
}

删除此 cookie 时,我的请求对象为空是否正常? 我是否没有通过删除它来正确复制 Spring 会话超时? 此空指针异常仅在删除此 Cookie 时发生,并且在首次运行 Web 应用时,控制器不会在首次运行创建 Cookie 时引发异常。 我是否应该以某种方式检查此 null 值并将控制器重定向回此方法(如果是)?

谢谢!

解决方案是添加以下方法参数:

@CookieValue(value = "MDHISStaySignedIn", defaultValue = "notFound") String cookie

这会将 cookie 的内容分配给值(如果存在),如果不存在,则分配"notFound"。 这样,当请求对象为空时,可以访问cookie!

最新更新