【问题标题】:Spring - HttpServletRequest object null when deleting JSESSIONID cookie?Spring - 删除 JSESSIONID cookie 时 HttpServletRequest 对象为空?
【发布时间】: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


【解决方案1】:

解决方法是添加如下方法参数:

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

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

【讨论】:

    猜你喜欢
    • 2013-01-08
    • 2012-01-20
    • 2019-08-13
    • 2016-08-17
    • 2013-04-03
    • 2014-12-02
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    相关资源
    最近更新 更多