10

以下のようなシナリオを考えてみましょう。

  1. ユーザーは、symfony2 コントローラーへの AJAX 呼び出しを作成し、結果を JSON 形式で返すフィルター ボタンを選択します。
  2. ユーザーが他のリンクを選択すると、システムはユーザーをページにリダイレクトします
  3. ユーザーはブラウザの [戻る] ボタンを選択します。
  4. ユーザーには JSON 応答が表示されますが、元のページが表示されるはずです。

私のコントローラーは以下のようになります:

/**
 * 
 *
 * @Route("/ajax", name="ajax_route" , options={"expose"=true})
 * @Template()
 */
public function someAction()
{
    $request = $this->getRequest();

    $json = array( );

    if($request->isXmlHttpRequest())
    {

        $res = json_encode($json);

        return new Response($res , 200 , array( 'Content-Type' => 'application/json' ));
    }

    return array( );
}  

つまり、ユーザーが戻るボタンを押すと、if($request->isXmlHttpRequest())探している結果ではない true が返されます。それは正常な動作ですか、それとも何ですか?

4

3 に答える 3

10

Symfony\Component\HttpFoundation\Request::isXmlHttpRequest()X-Requested-Withは、HTTPリクエストが値を持つヘッダーを思いついたかどうかをチェックする単純なユーティリティメソッドですXMLHttpRequestX-Requested-Withしたがって、ヘッダーと同じくらい信頼性があります。

ただし、これはそれほど重要ではありません。注意すべき重要な点は、ユーザーが[戻る]ボタンをクリックしても、ブラウザが新しいHTTPリクエストをサーバーに送信しないという事実です。内部メモリ/キャッシュからページを復元するだけです。

于 2012-08-13T21:11:40.997 に答える
4

これは古い質問であることは理解していますが、同じ問題が私を捕まえたので、とにかく答えを書きたいと思いました.

ほとんどのシナリオでは、次のように onUnload ハンドラーをウィンドウにアタッチすることで、戻るボタンのキャッシュを無効にすることができます。

window.addEventListener('unload',function(){});

または、jQuery を使用する場合:

$(window).unload(function(){});

ただし、AJAX 応答は JSON であるため、スクリプトのフラグメントを含めることができないため、明らかに不可能です。cache-control: no-storeこの場合、ブラウザーが結果をキャッシュしようとしないようにヘッダーを設定するのが最善の方法だと思います。

OPの場合、Symfony2を使用してそれを行うことができます:

return new Response($res , 200 , array(
    'Content-Type' => 'application/json',
    'Cache-Control' => 'no-store',
));

または、より一般的な PHP の場合:

header('Cache-Control: no-store');

アプリの構造によっては、パフォーマンスがかなり低下する可能性があるという点で注意が必要です。その場合、最善の策は、AJAX 呼び出しに別の URL を使用することです。ひどい、私は知っています。

bfcache hereに関するいくつかのドキュメントを見つけることができます。これは、さまざまなケースでより役立つ場合があります。

于 2013-04-28T14:29:00.277 に答える
0

ブラウザーは、URL と要求メソッド (GET、POST など) のみをキーとして使用して応答をキャッシュします。

ブラウザーに追加のバリエーションを認識させたい場合は、応答に Vary ヘッダーを設定することで認識させることができます。したがって、あなたの場合、「X-Requested-With」ヘッダーがリクエストに設定されているかどうかによって、サーバーからの応答が異なることをブラウザに伝えたいと思います。

方法は次のとおりです。

$response = new Response();

$response->setVary("X-Requested-With"); // <=========== Set the Vary header

if($request->isXmlHttpRequest()) {
    //...
}

return $response;

注: 応答の両方のバージョンで Vary ヘッダーを設定する必要があることに注意してください (これが、if ステートメントの外で設定した理由です)。

于 2016-05-31T23:28:51.373 に答える