我正在测试我的网络应用中的新功能,即使在浏览会话到期后我也允许用户保持登录状态。为了实现这一点,我在登录页面上有一个“让我登录”复选框。成功登录后,将创建一个包含userID的cookie,并且登录过程将继续正常进行。我的主控制器中的第一个方法首先检查是否存在该cookie,读取其中的userId,正确设置会话中的User对象并绕过登录过程,直接进入主页。当用户注销时,将重新创建cookie,其到期时间为0,这意味着它会被自动删除。
我的春季课程目前持续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会话超时吗?此NullPointerException仅在删除此cookie时发生,并且在首次运行Web应用程序时,控制器不会在第一次运行时创建cookie时抛出异常。我应该以某种方式检查这个空值并将控制器重定向回这个方法,如果它是?
谢谢!
答案 0 :(得分:0)
解决方案是添加以下方法参数:
@CookieValue(value = "MDHISStaySignedIn", defaultValue = "notFound") String cookie
如果它存在,这将把cookie的内容分配给值,如果不存在,则分配“notFound”。这样,当请求对象为空时,可以访问cookie!