web-dev-qa-db-ja.com

jQuery Ajaxの投稿リクエストがChrome

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:// 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 {

}

期待される結果は、コードが成功コールバックを通過することです。代わりに、要求は数分間保留状態のままになり、エラーコールバックに入ります。

18
N Sarj

_$.post_は、いくつかのオプションをデフォルト設定するだけで、_$.ajax_を呼び出しています。

_$.post_は、contentTypeを_"application/x-www-form-urlencoded; charset=UTF-8"_にデフォルト設定します。これは、シリアル化されたフォームのデータペイロードと一致します。

_$.ajax_を呼び出すと、contentTypefalseに設定されます。これにより、ブラウザーがプリフライトOPTIONSリクエストをサーバーに送信し、動作の違いを引き起こす可能性があります経験しています。

jQuery.ajax()の詳細と ここで渡されるオプション に基づくさまざまな動作を読むことをお勧めします

1