2009-04-06 13 views
3

私は認証されたセッションとAjaxリクエストを実装するためにdjangoとjqueryを使用しています。Ajaxコールバックは、ユーザーの認証済みセッションがタイムアウトしたことをどのように認識しますか?

私は、認証されたユーザーを、自分のサイトで長時間使用していない状態でログアウトさせるために、セッションタイムアウトを認証しました。私のサイトのページの中には、認証されたセッションに入ることを要求する多くのAJAX呼び出しがあります。ユーザーが長い間このようなページを開いたままにしてセッションを自動タイムアウトさせると、AJAX呼び出しは失敗し、ブラウザエラーが表示されます。私のWebスタック(django)は、これらのAJAXリクエストのログインにリダイレクトを返しますが、$ .ajax()にエラーとして表示されます(jqueryを使用します)。

ページをリロードし、自分の認証セッションがタイムアウトしたときにAJAXリクエストを通じてログインページを開きますか?本当にシンプル

答えて

7

一つの方法は、ただのページにpingを実行するスクリプトを持っているだろうそれがまだログインしているかどうかを確認してください。しかし、これはあなたがしなければならないAJAXリクエストの数を増やします。

別のオプションは、$.ajax()complete機能が渡されるXMLHttpRequestオブジェクト上のHTTPステータスコードをチェックすることです:

$.ajax({..., complete = function(xhr, textStatus){ 
    if(xhr.status > 300 && xhr.status < 400) //you got a redirect 
     window.location.href = '/login/'; 
    ... 
    }, ...); 
+0

jquery complete関数が何らかの魔法を提供するかどうかは不明ですが、ほとんどのブラウザはリダイレクト応答を透過的に処理します。つまり、コールバックによって受信された応答は200ステータスのリダイレクトになります。私が間違っていない限り、これは私がextjsで扱っているものです。 –

1

は、あなたが多分

{'error', 'notloggedin'} 

、エラーコードのいくつかの並べ替えを返すクエリを実行しているものは何でもスクリプト持って、あなたがする必要があるすべてはあなたのJavaScriptでこの値をチェックしています。それが見つかった場合、あなたはJavascriptをログインページにリダイレクトさせる

window.location.href = '/login/'; 

ような何かを(必要に応じてパスを変更)

+0

Djangoフレームワーク」とは、要求をリダイレクトしようとDjangoの認証方法ではあなたがアクセスしようとしていたページの次のものを「ログイン」してください。この場合、このアプローチはうまくいかないでしょう。 – MikeN

+0

@MikeN:私はマーティンの提案はまだあなたのために働くと思います。 authデコレータを使用する代わりに、ビューでuser_passes_test関数を使用します。失敗した場合、AJAX呼び出し元に戻るためにLOGINを取得できます。 –

+0

@MikeN:docsのuser_passes_testのURL:http://docs.djangoproject.com/en/dev/topics/auth/#limiting-access-to-logged-in-users-that-pass-a-を参照してください。テスト –

関連する問題