17

バックエンドを変更せずに、古い Web サイト フォームを AJAX 化しようとしています。当初、バックエンドはフォームを受信した後、「ありがとう」ページへの「302 Moved」リダイレクトで応答していました。

ここで、jQuery $.ajax 呼び出しを使用してフォームを送信しようとすると、フォーム データは正常に送信されますが、「302 Moved」リダイレクトがブラウザーによってキャンセルされたようで、jQuery は何が起こっているのかわかりません。

私の問題は、何が起こっても $.ajax 呼び出しがエラーとステータス = 0 で返されるため、送信の成功とエラーを区別する方法がないことです。

ブラウザがリダイレクトに従おうとしたり、少なくとも適切な応答コードを返そうとしたりするのを防ぐ方法はありますか? (私はChromeを使用しています。)

4

5 に答える 5

1

いいえ、バックエンドを変更せずにそれを行うことはできないと思います.Ajaxが何をすべきかを知る/理解するために、応答ヘッダーを変更する必要があります.リダイレクトを作成した場合は、ヘッダーを変更する必要があります.コールレスポンスはそれを行いません。

于 2015-06-11T21:27:34.923 に答える
0

あなたのバックエンドアプリには、おそらくjquery ajaxによって処理されない可能性のある相対リダイレクトがあります。この場合、ロケーション ヘッダーにはドメイン名が含まれず、相対パスのみが含まれます。いくつかの(私には不明です;))理由により、同じオリジンポリシーの問題が発生する可能性があります。おもしろいことに、リダイレクトを絶対パスに変更すると問題が解決するはずです。jQuery 1.11.1 でテスト済み。

コードを使用して説明する:

理論的な ajax 呼び出し:

$.ajax({
    'url': '/your-url',
    'method': 'post',
    'data': form.serialize()
}).done(function(data) {
    // something
}).fail(function(jqXHR, textStatus, errorThrown) {
    // another something
});

したがって、 /your-url コントローラーには次のようなものがあるかもしれません:

return $this->response->redirect('//same.domain/path');

また

return $this->response->redirect('/path');

最初のものはうまくいきます。2番目はそうではありません。

そう?

ポイントは、おそらくバックエンドを変更する必要があるということですが、ほんの少しだけです。リクエストが XmlHttpRequest であるかどうかを確認する必要はありません。実際に別の方法で処理したくない場合や、処理したくない場合は、確認する必要はありません。

于 2015-06-11T22:13:34.543 に答える
0

Ajax コードは次のようになります。

$.ajax({
'url': '/your-url',
'method': 'post',
'data': form.serialize()
}).done(function(data) {
    // something
  }).fail(function(jqXHR, textStatus, errorThrown) {
if (jqXHR.getResponseHeader('Location') != null)
{ 
 window.Location= jqXHR.getResponseHeader('Location');
 }
 // other conditions in failure situation.
});
于 2016-02-13T17:45:59.647 に答える
0

フォームを確認して {{csrf_field()}} を追加してください。フォームがトークンなしで送信された場合に発生します。

于 2017-03-03T07:50:10.597 に答える