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

时间:2018-03-12 13:34:47

标签: java spring servlets nullpointerexception controller

我正在测试我的网络应用中的新功能,即使在浏览会话到期后我也允许用户保持登录状态。为了实现这一点,我在登录页面上有一个“让我登录”复选框。成功登录后,将创建一个包含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时抛出异常。我应该以某种方式检查这个空值并将控制器重定向回这个方法,如果它是?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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