SpringコントローラーにAjaxポストリクエストを行うjQueryクライアントがあります。サーバー側では、エラーは記録されていません。クライアント側では、要求が非常に長い時間(数分)保留状態のままになり、ERR_SPDY_PROTOCOL_ERRORまたはERR_CONNECTION_CLOSEDで失敗する場合があります。
この問題はChromeでは再現可能ですが、Firefoxでは再現できません。確認済みの影響を受けるバージョンは70.0.3538.77ですが、他にもある可能性があります。また、問題はアプリケーションの特定のデプロイメントで発生し、他の場所、開発または本番では発生しません。
クライアントはその環境でHTTPS 2要求を送信します。開発環境では、HTTP 1.1です。サーバーでは、すべての要求が1.1として記録されます。
明らかな理由はありませんが、リクエストは処理を開始しましたが、これは繰り返し発生する問題であり、解決したいと考えています。問題が発生し始めたので、私はそれを再現できず、問題がサーバーへの接続が多すぎるかどうかを確認できません(6を超える)。私は3台のDNSサーバーを使用していますが、最後の1台はGoogleの8.8.8.8です。
コードの修正またはこれがサーバーのセットアップに関連するかどうかのヒントを探しています。クライアントコードとネットワークの組み合わせであることはほぼ確実です。
問題ではないもの:
予測サービス関連( ChromeのJQueryによる停止および保留中のajaxリクエスト )-プロキシと接続に関するコメントは、より関連性が高いようです。
広告ブロッカー拡張機能/プラグイン( Chromeでリソースをロードできませんでした )
私が失敗したこと:
質問に答えないもの:
クライアント側では、ブラウザのデータを消去し、ソケットをフラッシュし、プライベートブラウジング/シークレットモードを試しました。
時々、まれにエラーをバイパスする唯一のことは、シークレットモードで行われ、ソケットをフラッシュし、chrome:// net-internals /#eventsからキャッシュを空にすることです。
var formData = new FormData();
formData.append( /* ... */ );
//...
$.ajax({
type: "POST",
url: "/somepath/update",
cache: false,
data: formData,
contentType: false,
processData: false,
success: function(result) {
//...
},
fail: function(result) {
//....
},
error: function( jqXHR, textStatus, errorThrown ){
alert(textStatus + ":" + errorThrown);
}
});
$ .postを使用した別のリクエストが通過していました。
$.post("someotherpath/update", $("#someForm").serialize())
.done(function (data) {
//...
})
.fail(function (data) {
//...
})
.always(function () {
//...
});
サーバ側:
@RequestMapping(value="/somepath/update", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
public @ResponseBody String update(ModelClass model) {
JSONObject result = new JSONObject();
//...
return result.toString();
}
関連する場合は、次のフィルターがあります。現時点ではこれ以上投稿できません。
@Configurable
public class Filter1 extends OpenEntityManagerInViewFilter implements Filter{
public void doFilterInternal(HttpServletRequest httpReq, HttpServletResponse httpResp, FilterChain chain)
throws ServletException, IOException {
//...
}
}
@Configurable
public class Filter2 extends OncePerRequestFilter implements Filter{
public void doFilterInternal(HttpServletRequest httpReq, HttpServletResponse httpResp, FilterChain chain)
throws ServletException, IOException {
//...
}
}
@Order(/* very small integer */)
public class Filter3 extends OncePerRequestFilter {
}
期待される結果は、コードが成功コールバックを通過することです。代わりに、要求は数分間保留状態のままになり、エラーコールバックに入ります。
_$.post
_は、いくつかのオプションをデフォルト設定するだけで、_$.ajax
_を呼び出しています。
_$.post
_は、contentType
を_"application/x-www-form-urlencoded; charset=UTF-8"
_にデフォルト設定します。これは、シリアル化されたフォームのデータペイロードと一致します。
_$.ajax
_を呼び出すと、contentType
がfalse
に設定されます。これにより、ブラウザーがプリフライトOPTIONSリクエストをサーバーに送信し、動作の違いを引き起こす可能性があります経験しています。
jQuery.ajax()
の詳細と ここで渡されるオプション に基づくさまざまな動作を読むことをお勧めします