request.getCookies() 抛出 NullPointerException 尽管请求不为空

request.getCookies() throws NullPointerException although the request is not null

我使用以下 utility 函数从 cookie 获取值:

public static long getClientTimezoneOffset(HttpServletRequest request) 
{
        long timeZoneOffset = 0;
        if(request != null)
        {
            Cookie[] cookies = request.getCookies(); // throws null pointer exeception from here

            if(cookies != null) 
            {
                for(Cookie cookie : cookies) 
                {
                    if(cookie.getName().equals("timezoneOffset")) 
                    {
                        try 
                        {
                            timeZoneOffset = Long.parseLong(cookie.getValue());
                        } 
                        catch (Exception ex) 
                        {
                            ex.printStackTrace();
                        }
                        break;
                    }
                }
            }

        }

        return timeZoneOffset;
}
java.lang.NullPointerException
  at org.apache.catalina.connector.Request.parseCookies(Request.java:2943)
  at org.apache.catalina.connector.Request.convertCookies(Request.java:2958)
  at org.apache.catalina.connector.Request.getCookies(Request.java:1987)
  at org.apache.catalina.connector.RequestFacade.getCookies(RequestFacade.java:662)
  at javax.servlet.http.HttpServletRequestWrapper.getCookies(HttpServletRequestWrapper.java:69)
  at javax.servlet.http.HttpServletRequestWrapper.getCookies(HttpServletRequestWrapper.java:69)
  at javax.servlet.http.HttpServletRequestWrapper.getCookies(HttpServletRequestWrapper.java:69)
  at javax.servlet.http.HttpServletRequestWrapper.getCookies(HttpServletRequestWrapper.java:69)

我检查了 request 对象,它不是 NULL。它并不总是抛出 exception 但有时会。这就是为什么越来越难以找出实际问题的原因。

我已经检查过与此相关的类似帖子,但 none 其中有帮助。感谢任何帮助。

看起来这是在版本 8.029 中修复的。看到这个错误:https://bz.apache.org/bugzilla/show_bug.cgi?id=58578

您的 Tomcat 版本很旧,可能是时候更新了。如果那不可能,请在调用 request.getCookies() 之前检查 request.getContext() == null。它可能只有在主机映射过程中出现问题时才会发生,但没有更多信息我无法告诉您确切原因。通过一些额外的日志记录,您也许能够将一个好的请求的详细信息与一个坏的请求的详细信息进行比较,看看有什么不同。

编辑:

升级到 tomcat 8.0.36 解决了问题。