【问题标题】:request.getCookies() throws NullPointerException although the request is not nullrequest.getCookies() 抛出 NullPointerException 尽管请求不为空
【发布时间】:2016-11-20 15:55:06
【问题描述】:

我有以下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,但有时。这就是为什么很难弄清楚实际问题的原因。

我已经检查过有关此的类似帖子,但没有任何帮助。任何帮助表示赞赏。

【问题讨论】:

  • “它并不总是抛出异常,但有时”对我来说听起来很奇怪。 NPE有消息吗?
  • 对不起。这个首字母缩略词NPE 是用来做什么的? @AndrewTobilko
  • 我已经发布了完整堆栈跟踪的一部分。我应该发布完整的吗?
  • 我认为,在这种情况下,你需要
  • 这几乎肯定是应用程序存储对HttpServletRequest 的引用超过请求有效时间的问题。我建议您 (a) 升级到 8.0.latest 并 (b) 修复您的应用。

标签: java tomcat servlets nullpointerexception session-cookies


【解决方案1】:

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

您的 Tomcat 版本已经很旧了,无论如何可能是时候更新了。如果这不可能,请在调用request.getCookies() 之前检查request.getContext() == null。它可能仅在主机映射过程中出现问题时才会发生,但如果没有更多信息,我无法告诉您确切的原因。通过一些额外的日志记录,您可能能够比较一个好的请求和一个坏的请求的详细信息,看看差异在哪里。

编辑:

升级到 tomcat 8.0.36 解决了这个问题。

【讨论】:

  • 也得到了同样的异常。 java.lang.NullPointerException at org.apache.catalina.connector.Request.getServletContext(Request.java:1593) at org.apache.catalina.connector.Request.getContextPath(Request.java:1910)
  • 改用((Request)request).getContext(),那不能NPE。
  • 没有request.getContext()这样的功能。当我键入 request.getContextPath() 时出现。顺便说一句,我已经升级到tomcat 8.0.36 并且无法重现该问题。确认问题已解决后,我会通知您。
  • 顺便说一句,我在这个版本的tomcat中也遇到了这个问题apache-tomcat-7.0.68。 @MarkOlsson
  • 这就是为什么投到 Request - ((Request)request).getContext()。 HttpServletRequest 中没有 getContext(),因为您只看到接口方法。如果您将request(小写r)转换为Request 对象,这就是它的实际情况(至少在Tomcat 中),您可以访问其他方法,例如getContext()。但这一切都没有实际意义,因为更新解决了问题,而且您无论如何都不需要这样做。
猜你喜欢
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
相关资源
最近更新 更多