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