2017-06-20 21 views
0

突堤が受信したヘッダーの順序を変更するようです。私はHttpServletRequestWrapperオブジェクトのgetHeaderNames()を使ってそれらを集めます。リクエストヘッダーの順番を変更する

要求に設定されているのと同じ順序で取得する方法があるかどうか知っていますか?

+0

どのような目的のためにですか? HTTP RFCでは定義されていません。あなたはおそらくそれに頼る必要がありますか? – EJP

答えて

1

は私の質問に答えるために返されたヘッダ名の順不同のコレクションを返します使用

意味...

Host: localhost 
Cookie: foo 
Cookie: bar 
Cookie: baz 
Accept: gzip 

要求の順序で配列に格納されます。ただし、メソッドgetHeaderNames()は、配列の各要素に基づいてセットを作成します。セットは要素の順序を保持しません。この問題を迂回によって

一つの解決策は、代わりHashSetLinkedHashSetを使用して、クラスorg.eclipse.jetty.http.HttpFields方法getFieldNamesCollection()を上書きすることです。影響が少ないと

別の解決策は、静的なカスタム 方法getHeaderNames()を書くことになり、このような何か:

static public String buildHeaderList(ServletRequest request){ 
    StringJoiner headerList = new StringJoiner(","); 

    Request req = (Request) request; 
    HttpFields fields = req.getMetaData().getFields(); 

    for (HttpField f : fields) 
    { 
     if (f!=null) 
      headerList.add(f.getName()); 
    } 

    return headerList.toString(); 
} 

リクエストオブジェクトは、org.eclipse.jetty.server.Request

のタイプである以上、多分他がありますエレガントなソリューション。お気軽に追加してください。

0

ヘッダーの順序は、(HTTP仕様とサーブレットの仕様に従って)同じヘッダー名内でのみ保証されます。 getHeaderNames()がちょうど[Cookie, Host, Accept]

しかしgetHeaders("Cookie")は、ヘッダがある[foo, bar, baz]

+0

こんにちはJoakim、答えに感謝します。私の目標は、ヘッダーの順序付きリストをそれらの値ではなく取得することです。ヘッダーの順序はHTTP/1.1仕様では保証されていませんが、具体的な必要性については私が知りたいと思います。 'getHeaderNames()'は常に同じ順序でヘッダーを返しますが、リクエストのものではないので、達成する方法があるのだろうかと疑問に思っていたようです。 – RogerFromSpace

+0

サーブレット仕様はこれをサポートしていません。この真実はSPDYとHTTP/2にも当てはまります。また、仲介者(プロキシ、ロードバランサなど)が自分のニーズに合わせて注文を変更できることも知っています。 –

関連する問題