【发布时间】:2018-03-12 13:34:47
【问题描述】:
我正在我的网络应用程序中测试一项新功能,即使在浏览会话到期后,我也允许用户保持登录状态。为了实现这一点,我在我的登录页面上有一个“保持登录状态”复选框。成功登录后,会创建一个包含用户 ID 的 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 时抛出异常。我是否应该以某种方式检查此空值并将控制器重定向回此方法(如果是)?
谢谢!
【问题讨论】:
-
我尝试在 HttpServletRequest 对象上添加对 null 的检查,并在它为 null 时再次重定向到 / 但同样的事情发生了。我让我网络上的另一个人浏览我的应用程序,他在第一次浏览时也收到 NullPointerException,刷新页面正常工作,因为 cookie 是在第一次浏览时创建的。这意味着我确实通过删除 cookie 正确地复制了 Spring 会话失效,这确实是一个问题。任何帮助将不胜感激!
-
我也尝试使用 @CookieValue("MDHISStaySignedIn") 字符串 cookie 作为我的 home 方法的参数,但它会抛出 HTTP 状态 400 消息,抱怨如果所述 cookie 不存在,则无法找到 cookie (如果用户没有选择保持登录状态,则不会这样)。我如何使用 HttpServletRequest 对象以外的东西访问 cookie?
标签: java spring servlets nullpointerexception controller