注: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>