2016-05-27 27 views
1

こんにちは私は、HttpServletRequestを使用して、ヘッダーセットを取得しようとしています。ここ列挙ヌルポインタ例外?

コードである:

public static Map<String, String> getHeaders(HttpServletRequest request) { 
    Map<String, String> headers = new HashMap<String, String>(); 

    Enumeration<String> headerNames = request.getHeaderNames(); 
    if (headerNames != null) { 
      while (headerNames.hasMoreElements()) { 
       String headerName = headerNames.nextElement(); 
       String header = request.getHeader(headerName); 
       headers.put(headerName, header); 
      } 
     } 
     return headers; 

} 

この方法は、()headerNames.nextElementでヌルポインタ例外をスローしているように見えます。

hasMoreElementsチェックがtrueを返す可能性がありますが、要素headerNames.nextElementがnullポインタ例外を引き起こしますか?

スタックトレース:

Stack trace : Caused by: java.lang.NullPointerException at org.apache.tomcat.util.buf.ByteChunk.equalsIgnoreCase(ByteChunk.java:608) at 
org.apache.tomcat.util.buf.MessageBytes.equalsIgnoreCase(MessageBytes.java:325) 
at org.apache.tomcat.util.http.NamesEnumerator.findNext(MimeHeaders.java:414) at org.apache.tomcat.util.http.NamesEnumerator.nextElement(MimeHeaders.java:438) 
at org.apache.tomcat.util.http.NamesEnumerator.nextElement(MimeHeaders.java:396) at generateRequestHeaderMap... 

あなたたちはこの問題で私を助けることができればそれは素晴らしいことです。

+2

stacktraceを送信し、スタックトレースで参照されている行を正確に示します。 –

+0

スタックトレース:原因:java.lang.NullPointerException at org.apache.tomcat。util.buf.ByteChunk.equalsIgnoreCase(ByteChunk.java:608) at org.apache.tomcat.util.buf.MessageBytes.equalsIgnoreCase(MessageBytes.java:325) at org.apache.tomcat.util.http.NamesEnumerator。 findNext(MimeHeaders.java:414) at org.apache.tomcat.util.http.NamesEnumerator.nextElement(MimeHeaders.java:438) at org.apache.tomcat.util.http.NamesEnumerator.nextElement(MimeHeaders.java: 396) at generateRequestHeaderMap ... – CTsiddharth

+0

Tomcatのどのバージョンですか?正確に。 –

答えて

1

問題が原因で発生したと思われます。ここでfindNext()は、(Tomcatの6.0.18に)やっていることです。

private void findNext() { 
    next=null; 
    for( ; pos< size; pos++) { 
     next=headers.getName(pos).toString(); 
     for(int j=0; j<pos ; j++) { 
      if(headers.getName(j).equalsIgnoreCase(next)) { 
       // duplicate. 
       next=null; 
       break; 
      } 
     } 
     if(next!=null) { 
      // it's not a duplicate 
      break; 
     } 
    } 
    // next time findNext is called it will try the 
    // next element 
    pos++; 
} 

顕著な行はこの次のとおりです。

next=headers.getName(pos).toString(); 

if(headers.getName(j).equalsIgnoreCase(next)) { 

ヘッダがマングルされた場合getName(j)nullを返すようにするために、それは可能かもしれません。その場合、equalsIgnoreCaseメソッドのByteChunkパスはNPEを送出します。

あなたは科学的にこれを追跡しようとしている場合は、以下を行う必要があります。(もしあれば)

  • は、要求の実際の生のバイトのホールドを取得し、腐敗の性質を決定するためにフォレンジックそれらを調べます
  • デバッガを接続してこのリクエストでアプリケーションを実行できるようにテストハーネスを設定し、ソースで例外をトラップします。

非科学的なアプローチは、Tomcatを最新のTomcat 6 ...またはそれ以降のバージョンのパッチリリースにアップグレードすることです。問題を修正する可能性があります。か否か。

ここに戻ってからのTomcat 6.0.20で、この問題の別の報告書は、2010年には:

0

これは私が成功した決勝のJBoss 6.1.0でのApache Tomcatをパッチを適用する方法である(中Apache Tomcatの6.0.20ソースコードに基づいてデプロイ/ jbossweb.sar/jbossweb.jar):

org.apache.tomcat.util.http.MimeHeaders.NamesEnumerator.findNext()

private void findNext() { 
     next=null; 
     for( ; pos< size; pos++) { 
      // (4 lines changed): check mb for null as suggested here: https://stackoverflow.com/questions/37493552/enumeration-null-pointer-exception/37493888#37493888 
      MessageBytes mb = headers.getName(pos); 
      if (mb != null) { 
       next=mb.toString(); 
      } 
      for(int j=0; j<pos ; j++) { 
       // (2 lines changed): check mb and nex for null as suggested here: https://stackoverflow.com/questions/37493552/enumeration-null-pointer-exception/37493888#37493888 
       mb = headers.getName(j); 
       if(mb != null && next != null && mb.equalsIgnoreCase(next)) { 
        // duplicate. 
        next=null; 
        break; 
       } 
      } 
      // new (just 1 comment line): if mb == null we assume next == null, thus it will be a duplicate (i.e. not found, causing no break) 
      if(next!=null) { 
       // it's not a duplicate 
       break; 
      } 
     } 
     // next time findNext is called it will try the 
     // next element 
     pos++; 
    } 

https://mail-archives.apache.org/mod_mbox/tomcat-users/201002.mbox/%[email protected]%3eに記載されているスレッドセーフではない実装は避けられますが、少なくとも不要なヘッダーを読み取っている間はNullPointerExceptionを回避してください。