2017-11-08 6 views
0

Spring MVCを4.0から4.3にアップグレードしました。 "GET"メソッドの応答ヘッダーでETag形式の変更が発生しました。 "GET"呼び出しを行っているクライアントは、応答ヘッダーに二重引用符で囲まれたETagsを取得します。以前は、応答ヘッダー内のETagには、 "GET"メソッドの二重引用符はありませんでした。例えばSpring MVCレスポンスヘッダ:ETagはGETリクエストの二重引用符を持っていますが、PUTリクエストはありません

Now: etag →"TVMzTWFpbmxpbmVEZXZvLTI5ODIxMQ" 
Previously: etag →TVMzTWFpbmxpbmVEZXZvLTI5ODIxMQ 

要求は直前のように、ヘッダー内のETagの周りに二重引用符を持っていない「PUT」の応答。

誰もが何故考えているのですか?

答えて

0

Spring 4.2.x以前では、ETagヘッダーの管理はありませんでした。これ以来、HttpEntityMethodProcessorに導入されています。このクラスは時間の経過とともに進化しており、ETagヘッダの管理はRFCを尊重している(または十分に近い)。あなたはこのcommitで見ることができるように

は、春のチームは、その管理に問題を修正:

先立ち、このコミットへの応答にヘッダをLASTMODIFIED

修正行方不明のETag /、HttpEntityMethodProcessorは避けるだろう ServletWebRequestを呼び出して条件付き要求を処理する前に、ETag/Last-Modified応答ヘッダーを書き込んでください。 これは、すでに というヘッダーが基になるサーブレット応答に書き込まれているため、重複する応答ヘッダー値を避けるために に行われました。

GET/HEADリクエストでは、 が正しく処理されているため、これらのケースではまだこれが必要です。 ServletWebRequest 一方では、これらのケースでは、これらのヘッダーを書き込めません - 開発者が 目的でレスポンスヘッダを追加しているし、状況をコントロールしなければなりませんので、しかし、 HttpEntityMethodProcessorは PUT/PATCH/POST応答にその決定を下すべきではありません。

修正コードの関連部分はhereです。

だから、基本的に、あなたが手動はそれ再現、又はHEADを方法、フレームワークはそれを削除するGET の状態の場合には、ETagヘッダを加えます。そのため、PUTでは、二重引用符はありません。HttpEntityMethodProcessorで

:ServletWebRequestで次に

if (inputMessage.getMethod() == HttpMethod.GET || inputMessage.getMethod() == HttpMethod.HEAD) { 
     responseHeaders.remove(HttpHeaders.ETAG); 
     responseHeaders.remove(HttpHeaders.LAST_MODIFIED); 
    } 

private String padEtagIfNecessary(String etag) { 
    if (!StringUtils.hasLength(etag)) { 
     return etag; 
    } 
    if ((etag.startsWith("\"") || etag.startsWith("W/\"")) && etag.endsWith("\"")) { 
     return etag; 
    } 
    return "\"" + etag + "\""; 
} 

あなたが見ることができるように、これはchapter 2.4 of the RFCを尊重:

2.4。それが不可能な場合を除き

oが生成 にエンティティタグバリデータを送信する必要があります:200(OK)応答GETまたはHEADする、オリジンサーバで

にエンティティタグとLast-Modifiedの日付を使用する場合1。強いエンティティタグを送信することは実現不可能である場合 パフォーマンスの考慮が弱いエンティティタグの使用、または をサポートしている場合

oは、弱いエンティティタグの代わりに、強いエンティティタグを送ることができます。

o送信が可能であれば、最終変更値を送信するべきである(SHOULD)。

言い換えれば、起点サーバの好ましい動作は、 の検索要求に対する成功のために、 が強いエンティティタグとLast-Modified値の両方を送信することです。

しかし、私はそれは、彼らが何をしたか上書き/スキップする可能性なしに、以前のこれらのバージョンに使用している可能性がどのような開発者の下位互換性があり、休憩ではないことがわかりました。

ここにはETag from the MDN(より明確になりました)の説明があります。

希望すると分かりやすくなります。

関連する問題