web-dev-qa-db-ja.com

Ajax Jquery呼び出しでリダイレクト

私はここでajaxの初心者であり、誰かがすでにこの問題に遭遇していることを知っています。私はSpring MVC上に構築されたレガシーアプリを持っています、それはセッションがないときはいつでもログインページにユーザーをリダイレクトするインターセプター(フィルター)を持っています。

public class SessionCheckerInterceptor extends HandlerInterceptorAdapter {
 public boolean preHandle(HttpServletRequest request,
   HttpServletResponse response, Object handler) throws Exception {
  HttpSession session = request.getSession();

  // check if userInfo exist in session
  User user = (User) session.getAttribute("user");
  if (user == null) {
   response.sendRedirect("login.htm");
   return false;
  }
  return true;
 }
}

非xmlhttpリクエストの場合、これは正常に機能します。しかし、アプリケーションでajaxを使用しようとすると、すべてが奇妙になり、ログインページに正しくリダイレ​​クトできません。の値を確認するように

xhr.status = 200 textStatus = parseError errorThrown = "無効なJSON-HTMLログインページのマークアップ-

$(document).ready(function(){
        jQuery.ajax({
            type: "GET",
            url: "populateData.htm",
            dataType:"json",
            data:"userId=SampleUser",
            success:function(response){
             //code here
            },
         error: function(xhr, textStatus, errorThrown) {
                alert('Error!  Status = ' + xhr.status);
             }

        });
});

Firebugで302 HTTP応答があることを確認しましたが、応答をキャッチしてユーザーをログインページにリダイレクトする方法がわかりません。ここにアイデアはありますか?ありがとう。

22
Mark Estrada

JQueryはjsonタイプの結果を探していますが、リダイレクトは自動的に処理されるため、生成されたhtmlを受け取ります_login.htm_ページのsource

1つのアイデアは、結果のオブジェクトにredirect変数を追加し、JQueryでチェックすることで、リダイレクトする必要があることをブラウザーに知らせることです。

_$(document).ready(function(){ 
    jQuery.ajax({ 
        type: "GET", 
        url: "populateData.htm", 
        dataType:"json", 
        data:"userId=SampleUser", 
        success:function(response){ 
            if (response.redirect) {
                window.location.href = response.redirect;
            }
            else {
                // Process the expected results...
            }
        }, 
     error: function(xhr, textStatus, errorThrown) { 
            alert('Error!  Status = ' + xhr.status); 
         } 

    }); 
}); 
_

また、応答にヘッダー変数を追加し、ブラウザーにリダイレクト先を決定させることもできます。 Javaでは、リダイレクトの代わりにresponse.setHeader("REQUIRES_AUTH", "1")を実行し、JQueryではsuccess(!)で実行します。

_//....
        success:function(response){ 
            if (response.getResponseHeader('REQUIRES_AUTH') === '1'){ 
                window.location.href = 'login.htm'; 
            }
            else {
                // Process the expected results...
            }
        }
//....
_

お役に立てば幸いです。

私の答えは このスレッド に強く触発されており、まだ問題がある場合に質問を残すべきではありません。

50
thmshd