处理ajax请求重定向需要结合前端代码ajax方法进行处理。
以下以跳转到百度页面为例
后端处理:给请求头塞参数
其中重要的两个参数如下:
- 添加重定向标识:“REDIRECT”,告诉ajax我是重定向:response.setHeader("REDIRECT", "REDIRECT");
- 添加请求路径:“CONTEXTPATH”,告诉ajax重定向路径:response.setHeader("CONTEXTPATH", "跳转路径");
- 将自定义请求头REDIRECT、CONTEXTPATH暴露给外部:response.setHeader("Access-Control-Expose-Headers", "REDIRECT,CONTEXTPATH");
后端代码示例如下:
//对于请求是ajax请求重定向问题的处理方法
public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
//获取当前请求的路径
//logger.error("请求类型:"+request.getHeader("X-Requested-With"));
response.setHeader("Access-Control-Expose-Headers", "REDIRECT,CONTEXTPATH");
//告诉ajax我是重定向
response.setHeader("REDIRECT", "REDIRECT");
//告诉ajax我重定向的路径
String url = "https://www.baidu.com/";//重定向路径
response.setHeader("CONTEXTPATH", url);
response.getWriter().write(1);
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
}
// 在业务处理器处理请求之前被调用
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
......校验未登录
if(未登录){
redirect(request,response);//调用重定向问题处理方法
return false;
}else{
return true;//请求放行
}
}
前端代码处理:ajax请求,自然是在ajax方法中做处理。后端传了参数的参数就是为了让前端来接收。
前端处理步骤如下:
1.在ajax方法中添加“complete ”,complete 在ajax中无论ajax请求成功或失败都会执行。
2.在complete 中获取响应头中的参数 REDIRECT ,该参数是我们在拦截器拦截成功后塞进去,用来标识该请求是重定向请求的。
3.获取请求路径,并跳转至百度页面
前端代码示例如下:
$.ajax({
url : "......",
type : "post",
data : {
......
},
success : function(text) {
......
},
error : function(e, f, g) {
......
},
complete : function(xhr, status) {
alert(status)
//拦截器实现超时跳转到登录页面
// 通过xhr取得响应头
var REDIRECT = xhr.getResponseHeader("REDIRECT");
//如果响应头中包含 REDIRECT 则说明是拦截器返回的需要重定向的请求
if (REDIRECT == "REDIRECT")
{
var win = window;
while (win != win.top)
{
win = win.top;
}
win.location.href = xhr.getResponseHeader("CONTEXTPATH");
}
}
});