springmvc Interceptor 攔截 ajax 請求 成功後,返回至頁面

注:Interceptor 的作用之一可以是攔截請求,判斷請求是否正常

 

問題:當 Interceptor 攔截ajax請求 後,返回false  但是ajax需要的是返回的數據,所以此時攔截器會返回一個false,但是這並不是ajax請求想要的數據,所以沒有執行相應的處理。

 

解決方法:在 Interceptor 攔截後返回指定的重定向請求頭信息

並且在ajax中,設置complete函數,讓請求完成後,自動執行該函數,判定是否存在請求頭信息

如果存在,那麼重定向到別的頁面

 

springmvc interceptor配置

    <!--攔截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/db/*"/>   <!--被攔截的請求-->
            <mvc:exclude-mapping path="/user/equale"/>  <!--不被攔截的請求-->
         
            <bean class="com.nextStep.interceptors.ExecuteIntercept"/>   <!-- 攔截器處理-->
        </mvc:interceptor>
    </mvc:interceptors>

 

代碼


//用戶操作攔截
public class ExecuteIntercept implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // if(request.getSession().getAttribute("LOG_IN_FLAG")==null){
      
        // 是ajax請求
        if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
            //告訴ajax我是重定向
            response.setHeader("REDIRECT", "REDIRECT");
            //告訴ajax我重定向的路徑
            response.setHeader("CONTENTPATH", "error.jsp");
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
            return false;
        } else {
            // 不是ajax請求
            response.setContentType("text/html; charset=UTF-8");
            response.getWriter().print("<html><body><script type='text/javascript'>alert('您的訪問過於頻繁,已被鎖定,請等待解鎖!');</script></body></html>");
            response.getWriter().close();
            response.flushBuffer();
        }
        return true;
    }
}

<script type="text/javascript">
        document.getElementById("submit").onclick=function(){
        document.getElementById("msg").innerHTML="";

        var name = document.getElementById("name").value;
        var password = document.getElementById("password").value;
        if(name==""){
            alert("請輸入用戶名。");
            return ;
        }
        if(password==""){
            alert("請輸入密碼。");
            return ;
        }

        document.getElementById("submitDisImg").src="img/wait.gif";
        $.ajax({
            url:"user/equale",     //請求地址
            contentType:"application/json;charset=UTF-8",  //傳輸數據類型
            data:JSON.stringify({name:name,password: password}),  //要傳輸的數據
            dataType:"json",   //返回值類型
            type:"post",     //請求方式
            success:function(msg){  //data表示服務端響應的數據
                if (msg=="success") {//根據返回值進行跳轉
                    window.location.href = 'index.jsp';
                }else{
                    document.getElementById("submitDisImg").src="";
                    document.getElementById("msg").innerHTML="用戶名或密碼錯";
                }
            },
            complete : function(xhr, status) {
                //攔截器實現超時跳轉到登錄頁面
                // 通過xhr取得響應頭
                var REDIRECT = xhr.getResponseHeader("REDIRECT");
                //如果響應頭中包含 REDIRECT 則說明是攔截器返回的
                if (REDIRECT == "REDIRECT"){

                    //重新跳轉到 login.html
                    window.location.href = xhr.getResponseHeader("CONTENTPATH");
                //window.location.href = "error.jsp";
                }
            }

        });
    }

</script>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章