Ajaxリダイレクトが無効です

4892 ワード

問題の背景
以前はresponseと書きました.sendRedirect("/login.jsp");成功しました.今日ajaxリクエストを使って、バックグラウンドに送信して、直接ジャンプして、無効なことを発見したいです.まずajaxリクエストとresponseを深く理解しなければなりません.sendRedirectのメカニズム
response.sendRedirectのメカニズム
この方式はクライアントでのリダイレクト処理である.この方法は,HTTPプロトコルのHEADER部分を修正することにより,ブラウザにリダイレクト命令を下し,locationで指定したURLに対してブラウザに要求を提出させ,ブラウザにリダイレクトページの内容を表示させる.この方法は絶対的または相対的なURLsを受け入れることができる.メソッドに渡されるパラメータが相対的なURLである場合、Web containerはクライアントに送信する前に絶対的な
forward
この方式はサーバ側でリダイレクトされる.サーバがクライアントにデータを送信するプロセスは、•サーバがクライアントにデータを送信する前に、バッファにデータを出力し、バッファ内のデータをクライアントに送信するプロセスです.バッファ内のデータをクライアント側に送信するのはいつですか?(1)クライアントからのrequestの処理が終了する、全てのデータがバッファに出力されると、•(2)バッファがいっぱいになると、•(3)プログラムでバッファの出力方法outが呼び出される.flush()またはresponse.flushbuffer()では、web containerがバッファ内のデータをclientに送信します.このリダイレクト方式は,サーバ側のバッファメカニズムを用いて,バッファのデータをクライアントに送信する前に,元のデータを送信せずにリダイレクトページに移行し,リダイレクトページのデータを送信し,リダイレクト呼び出しページのデータを消去する.JSP:FORWORDの前に多くの出力があり、前の出力でバッファがいっぱいになり、クライアントに自動的に出力される場合、このリダイレクト方式は機能しません.この点は特に注意してください.ServletContext sc = getServletContext(); RequestDispatcher rd = null; rd = sc.getRequestDispatcher("/index.jsp"); rd.forward(request, response);
リダイレクトと転送の違い
1、forwardリダイレクトはコンテナ内部で実現される同じWebアプリケーションのリダイレクトであるため、forwardメソッドは同じWebアプリケーションの1つのリソースにリダイレクトするしかなく、リダイレクト後ブラウザのアドレスバーのURLは変わらず、2、sendRedirectメソッドは任意のURLにリダイレクトすることができる.この方法はhttpヘッダを修正して実現されるため、URLには制限はない.リダイレクトするとブラウザのアドレスバーURLが変わります.2、forwardリダイレクト元のHTTPリクエストオブジェクト(request)を1つのservletインスタンスから別のインスタンスに渡し、sendRedirect方式では両者が同じアプリケーションではない.3、第2の点に基づいて、パラメータの伝達方式が違います.forwardのformパラメータは伝達されるので、HTTPリクエストのパラメータは第2の例で取得できる.sendRedirectはリンクを介してのみパラメータを渡すことができます.response.sendRedirect(“login.jsp?param1=a”). 4、sendRedirectは相対URLを処理し、自動的にそれらを絶対URLに変換することができ、アドレスが相対的であり、'/'が1つもない場合、Web containerは現在の要求URIに対してであると考えられる.例えばresponse.sendRedirect(「login.jsp」)では、現在のservletのURLパスの下からloginが探す.jsp: http://10.1.18.8:8081/dms/servlet/ServletリダイレクトされたURL:http://10.1.18.8:8081/dms/servlet/login.jsp、response.sendRedirect("/login.jsp")では、urlが現在の適用径から検索されます.http://10.1.18.8:8081/login.jsp.forwardは相対パスをこのように処理することはできません.
Ajax要求原理
Ajaxの原理:実際にはXmlHttpRequestオブジェクトを介してサーバに非同期リクエストを送信し、サーバからデータを取得し、javascriptでDOMを操作してページを更新する.XmlHttpRequestdオブジェクトの理解
  • XMLHttpRequestオブジェクトは、サーバに要求を発行します.サーバ側をデータインタフェースと見なすことができます.これは純粋なテキストストリームを返します.もちろん、このテキストストリームはXML形式であってもよく、Htmlであってもよく、Javascriptコードであってもよく、文字列
  • であってもよいです.
  • クライアントは、この結果を非同期で取得した後、直接ページに表示するのではなく、javascriptで処理してからページに表示します.クライアントは、この結果を非同期で取得した後、直接ページに表示するのではなく、javascriptで処理してからページに表示します.

  • したがって、要求はすべてAjaxを採用するため、ajax要求が発起されるたびに、ブロッカーは未登録がログインページにジャンプすると判断するが、今回のajax要求の結果がこのページ(具体的には、今回の要求がログインページのソースコードを返す)であるため、ブラウザがジャンプすることはない.要求完了イベント処理関数において、返すテキストがログインページのソースコードであるか否かを判断する(例えば、戻り値にユーザログインが含まれているか否かをチェックする、これはログインページに関係する)、含まれている場合top.location.href=「ログインページのurl」か、responseTextからのみジャンプ情報を取得できますjsジャンプを使用します
    解決策
    バックエンド:ajaxリクエストかどうかを判断してリダイレクトするかどうかは直接転送しますが、カスタムヘッダ情報を追加するには
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { 
    User u = (User) request.getSession().getAttribute("USER");
            // XMLHttpRequest
            String type = request.getHeader("X-Requested-With");
            if (u == null) {
                String path = request.getContextPath();
                String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path + "/";
                //    
                if (StringUtils.equals("XMLHttpRequest", type)) {
                // ajax   
                    response.setHeader("REDIRECT", "REDIRECT");//  ajax     
                    response.setHeader("CONTEXTPATH", basePath+"/signin.html");//     
                    response.setStatus(HttpServletResponse.SC_FORBIDDEN);
                    return false;
                } else {
                    response.sendRedirect(basePath+"index.jsp");
                    return false;
                }
            }
            return true;
    }
    

    フロントエンド:ajax応答が終了した後、ヘッダー情報を取り出してページジャンプを行うグローバルメソッドを追加します.
    $.ajaxSetup( {    
            //  ajax           
            complete : function(XMLHttpRequest, textStatus) {  
                //   XMLHttpRequest     ,REDIRECT 
                var redirect = XMLHttpRequest.getResponseHeader("REDIRECT");// HEADER   REDIRECT         
                if (redirect == "REDIRECT") {  
                    var win = window;    
                    while (win != win.top){  
                        win = win.top;  
                    }  
                  //            ,  win.location.href          
                  win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH");    
                }  
            }    
        });
    

    参照先:http://www.blogjava.net/followith/archive/2009/04/24/267324.html https://blog.csdn.net/jazywoo123/article/details/7981791