2009-08-12 72 views
10

jQueryとjQuery.formプラグインを使用してフォームを送信します(ASP.Net MVCも使用します)。jQuery AJAXはリダイレクトをステータス200ではなく302と見ますか?

フォーム認証を使用しているサイトのセクションにユーザーがいて、ログインページへのリダイレクトである302のステータスを返す代わりに、その認証Cookieの有効期限が切れた場合、私はまだ200を得る?放火犯で

私は302が見つかり、その後、私のログインページが次の私のAjax呼び出しに送り返すステータスコードを200として提供しています参照してください。 302がjQueryフォームプラグインに送り返されることがないとログアウトしたことをどのように検出しますか?

+0

あなたは認証クッキーをチェックしようとしたことがありますか? – user120242

答えて

0

キャッシュにしてみてください:偽cache option in 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); 
    ... 
} 
+0

同じ結果 - 私は302と200の両方がFirebugで表示されますが、jsは200を表示します。( – Slee

+0

はajax呼び出しの完全なURLを見ることができます? –

+0

ここにJSコードを記入してください。ありがとう –

0

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

サーバー側:

私はセッションがまだ有効であるかどうかをチェックしていたとき、私も "に目を光らせておきますあなたがjQueryを使っているならば、 "XMLHttpRequest"でなければなりません(注:IEは小文字のヘッダ名を返す傾向がありますので、それも見てください)。クライアント側

{ "SESSION": "EXPIRED" } 

:セッションは確かに有効期限が切れており、ヘッダが代わりにHTTPリダイレクト使用するので、私はこのような単純なJSONオブジェクトで応答し、存在する場合、私のonloadイベントコードで

を、私が使用し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'); 
}); 
0

私は、XHRオブジェクトの完成した状態では決して302を取得しないと確信しています。リダイレクトが発生した場合、ログインページからの応答が表示されるまで接続は処理中です(存在する場合は200にする必要があります)。

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

代替は、あなたがセッションの期限が切れているとすぐに知りたい場合にのみ、認証ステータスに関する情報を取得するためにはsetTimeoutまたは類似を使用してサーバーをポーリングすることです。

幸運。

7

私はこのソリューションが本当に好きです。 ajaxリクエストの302レスポンスを401に変更することで、クライアント側のajaxを設定して401を探しているAjaxリクエストを監視し、ログインページにリダイレクトするリクエストがあればそれを探します。非常に簡単で効果的です。

グローバル。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; 
      } 
     } 
     }); 
    }); 
関連する問題