9

jQuery と jQuery.form プラグインを使用してフォームを送信しています (ASP.Net MVC も使用しています)。

問題は、ユーザーがフォーム認証を使用するサイトのセクションにいて、ログイン ページへのリダイレクトである 302 のステータスを取得するのではなく、ページでの時間中に認証 Cookie の有効期限が切れた場合でも、200 を取得することです。 ?

FireBug では、302 Found が表示され、次にログイン ページが 200 として提供されます。これは、Ajax 呼び出しに返されたステータス コードです。jQuery フォーム プラグインに 302 が返されない場合、ログアウトされたことを検出するにはどうすればよいですか?

4

5 に答える 5

9

私はこのソリューションが本当に好きです。ajax リクエストの 302 レスポンスを 401 に変更することで、クライアント側で ajax をセットアップして、401 を探している ajax リクエストを監視し、それが見つかった場合はログイン ページにリダイレクトすることができます。非常にシンプルで効果的です。

Global.asax:

protected void Application_EndRequest()
{
    if (Context.Response.StatusCode == 302 &&
        Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
    {
        Context.Response.Clear();
        Context.Response.StatusCode = 401;
    }
}

クライアント側コード:

 $(function () {
      $.ajaxSetup({
        statusCode: {
          401: function () {
            location.href = '/Logon.aspx?ReturnUrl=' + location.pathname;
          }
        }
      });
    });
于 2011-07-14T21:02:50.653 に答える
1

cache: false で試してくださいjquery ajax のキャッシュ オプション:

$.ajax({
  url: "test.html",
  cache: false,
  success: function(html){
    $("#results").append(html);
  }
});

---EDIT C#コードでこれを試してください:

protected void Page_Load(object sender, System.EventArgs e)
{
   Response.Cache.SetCacheability(HttpCacheability.NoCache);
   ...
}
于 2009-08-12T19:22:37.973 に答える
0

XHR オブジェクトの完了ステータスで 302 を取得することはないと確信しています。リダイレクトが発生した場合、ログイン ページからの応答が表示されるまで (存在する場合は 200 になるはずです)、接続は進行中のままです。

しかし、なぜ 302 を見る必要があるのでしょうか。確かに、login.php へのリダイレクトを取得している場合、返された応答の URL (またはコンテンツの解析) を取得するだけで、ログアウトしたことがわかりますか?

別の方法として、セッションが期限切れになるとすぐに (何らかのアクションを実行する前に) 知りたい場合にのみ、setTimeout などを使用してサーバーをポーリングし、認証ステータスに関する情報を取得します。

幸運を。

于 2010-10-21T10:12:12.273 に答える
0

これは私が過去に使用したソリューションです:

サーバ側:

セッションがまだ有効かどうかを確認するときは、「X-Requested-With」ヘッダーも監視します。これは、jQuery を使用している場合は「XMLHttpRequest」である必要があります (注: IE は通常、小文字のヘッダー名なので、それにも注意してください)。セッションが実際に期限切れになり、ヘッダーが存在する場合、HTTP リダイレクトを使用する代わりに、次のような単純な JSON オブジェクトで応答します。

{ "SESSION": "EXPIRED" }

クライアント側:

私のオンロード コードでは、jQuery の ajaxComplete イベントを使用して、セッション期限切れオブジェクトのすべての着信要求ペイロードをチェックします。コードは次のようになります。

$(window).ajaxComplete(function(ev, xmlhr, options){
    try {
        var json = $.parseJSON(xmlhr.responseText);
    }
    catch(e) {
        console.log('Session OK');
        return;
    }

    if ($.isPlainObject(json) && json.SESSION == 'EXPIRED') {
        console.log('Session Expired');

        //inform the user and window.location them somewhere else

        return;
    }

    console.log('Session OK');
});
于 2010-07-11T23:12:23.200 に答える