2013-01-07 8 views
7

私はクライアントにAJAXコールを発行しています。これらの呼び出しは、Sever側でSpring Securityによって保護されているURLを参照します。ユーザーのセッションがタイムアウトした場合は、ライトボックスにログインフォームのポップアップが表示されます。ユーザーが正常にログインした後、クライアントにAJAX呼び出しを再実行します。認証が失敗した場合、サーバはhandleErrorのを呼び出し、クライアントに結果401を返すSpring Securityのログインが成功した後、AJAXの成功関数をコールバックするにはどうしたらいいですか?

function handleSearchClick(evt) { 
    var setupOptions = { 
     success: loadSearch, 
     type: "POST", 
     dataType: "json",    
     url: "../search.ajax", 
     error: handleError, // how can I pass callback info i.e. I want to be able to execute $("#searchForm").ajaxSubmit(setupOptions); from handleError? 
     timeout: 50000 
    };     
    $("#searchForm").ajaxSubmit(setupOptions); 
} 

はここでAJAX呼び出しを行うクライアント側コードの例です。 handleErrorにコールバック関数を渡すことは可能ですか?私は、コールバックが再実行

$("#searchForm").ajaxSubmit(setupOptions); 

したいと思う私は、サーバーがセッションをタイムアウトしたAJAX呼び出しに成功応答を返すこの問題の解決策を見てきました。次に、成功関数は、セッションタイムアウトを知るための応答で何かを探します。クライアントはそこにコールバック関数を格納します。私はエラー機能でこれを処理することを好みます。

+0

私の答えはあなたのために働いたのですか? – Alex

+0

答えをありがとう。しかし、以下のコードでは、 "あなたは以下のことを行うことができます"、handleErrorが$( "#searchForm")。ajaxSubmit(setupOptions)を呼び出す方法がわかりません。これがどのように行われるかについての詳細を提供するように編集してください。 – James

答えて

3

要求を行うことができ

$("#searchForm").ajaxSubmit(setupOptions); 

あり

$.ajax(this); 

を呼び出すことにより、handleErrorの機能に再実行することができます渡す必要はありません再実行するコールバック関数:救助へ

$("#searchForm").ajaxSubmit(setupOptions); 
2

私はそれをここに述べている:How to send a form without refreshing the page?

それはエラーハンドラのコールバックを持つ方法です。

$.ajax({ 
    url: siteUrl + 'fetch/search', 
    type: "POST", 
    data: formData, 
    success: function(data) { 
     ..... 
    }, 
    error:function(x,e){ 
     if(x.status==0){ 
      alert('You are offline!!\n Please Check Your Network.'); 
     }else if(x.status==404){ 
      alert('Requested URL not found.'); 
     }else if(x.status==500){ 
      alert('Internel Server Error.'); 
     }else if(e=='parsererror'){ 
      alert('Error.\nParsing JSON Request failed.'); 
     }else if(e=='timeout'){ 
      alert('Request Time out.'); 
     }else { 
      alert('Unknow Error.\n'+x.responseText); 
     } 
    } 
}); 

しかし、あなたがで実行される次

function handleSearchClick(evt) { 
    var setupOptions = { 
     success: loadSearch, 
     type: "POST", 
     dataType: "json",    
     url: "../search.ajax", 
     error: handleError(x,e), // this should do it 
     timeout: 50000 
    };     
    $("#searchForm").ajaxSubmit(setupOptions); 
} 
+2

エラーは、関数への参照である必要があります。ただし、最後のコードスニペットでは、関数の呼び出しがあります。 – James

2

Closures:これは、参照ループを作成すること

function handleSearchClick(evt) { 
    var setupOptions = { 
     success: loadSearch, 
     type: "POST", 
     dataType: "json", 
     url: "../search.ajax", 
     timeout: 50000 
    }; 
    setupOptions.error = handleError(setupOptions); 
    $("#searchForm").ajaxSubmit(setupOptions); 
} 

function handleError(setupOptions) { 
    return function() { 
     // handle error 

     // then re-submit 
     $("#searchForm").ajaxSubmit(setupOptions); 
    }; 
} 

注(setupOptionsはhandleErrorのによって返されるエラー関数への参照を有する、誤差関数を有していますsetupOptionsへの参照)、これはまともなブラウザで簡単にガベージコレクションされるはずです。

+0

ありがとう!これは質問に対する正しい解決策です。私はjqueryの呼び出し$ .ajax(this)は、一般的な方法で複数のタイプのリクエストからのエラーを処理するために優れていると思います。私は自分の質問を投稿するまでその機能が存在していたことに気付かなかった。 jquery呼び出しが存在しなかった場合は、これを行うのに最適な方法として+1を回答に付けました。 – James