Ajax请求时无法重定向的问题解决代码详解


Posted in Javascript onJune 21, 2019

前言

今天发现,当使用Ajax请求时,如果后台进行重定向到其他页面时是无法成功的,只能在浏览器地址栏输入才能够实现重定向。

Ajax默认就是不支持重定向的,它是局部刷新,不重新加载页面。

需要实现的功能是,后台网关拦截请求,看请求中是否存在token.如果不存在就跳转到登录页面。因为大多数请求都是使用Ajax.一开始发现无法进行重定向,每次都是返回到Ajax的结果处理函数。最终的解决办法如下,需要后台和前端进行处理。

后台:

/**
*功能描述
* @author lgj
* @Description 重定向工具类
* @date 2/27/19
*/
@Slf4j
public class RedirecUtil {
/**
*功能描述
* @author lgj
* @Description 重定向
* @date 2/27/19
* @param:
* @return:
*
*/
public static void redirect(RequestContext ctx, String redirectUrl){
try{
//如果是Ajax请求
if("XMLHttpRequest".equals(ctx.getRequest().getHeader("X-Requested-With"))){
log.debug("ajax redirect");
sendRedirect(ctx.getResponse(),redirectUrl);
}
//如果是浏览器地址栏请求
else {
log.debug("normal redirect ");
ctx.getResponse().sendRedirect(redirectUrl);
}
}
catch(Exception ex){
ex.printStackTrace();
}
}
/**
*功能描述 
* @author lgj
* @Description Ajax请求时重定向处理
* @date 2/27/19
* @param: 
* @return: 
*
*/
private static void sendRedirect(HttpServletResponse response, String redirectUrl){
try {


 //这里并不是设置跳转页面,而是将重定向的地址发给前端,让前端执行重定向
//设置跳转地址
response.setHeader("redirectUrl", redirectUrl);
//设置跳转使能
response.setHeader("enableRedirect","true");
response.flushBuffer();
} catch (IOException ex) {
log.error("Could not redirect to: " + redirectUrl, ex);
}
}
}

前端处理

第一种方式:使用Ajax的complete方法

$.ajax({
type: "post",
url: "/auth/token/check",
success: function(data,status){
console.log("/token/check 返回 status : "+status)
},
//请求完成调用
(XHR, TS){
console.log("complete");
var url = XHR.getResponseHeader("redirectUrl");
console.log("redirectUrl = " + url);
var enable = XHR.getResponseHeader("enaleRedirect");
console.log("enableRedirect = " + enable);
if((enable == "true") && (url != "")){ 
var win = window; 



 while(win != win.top){



win = win.top;




}




 win.location.href = url; 





} 



}, 


});
})

但是上面有个问题就是,每个ajax都需要编写 comlete 方法,代码复用率低。

第二种方法 : 使用全局的complete方法

ajax请求

$("#NON-TOKEN").click(function () {
$.ajax({
type: "post",
url: "/auth/token/check",
success: function(data,status){
console.log("/token/check 返回 status : "+status)
},
});

全局处理

注意这参数(event, xhr, settings)不能少,否则会报错。

//每一个Ajax 请求完成之后都会执行。
$(document).ajaxComplete(function (event, xhr, settings) {
console.log("ajaxComplete ")
redirectHandle(xhr);
})
function redirectHandle(xhr) {
//获取后台返回的参数
var url = xhr.getResponseHeader("redirectUrl");
console.log("redirectUrl = " + url);
var enable = xhr.getResponseHeader("enableRedirect");
if((enable == "true") && (url != "")){
var win = window;
while(win != win.top){
win = win.top;
}
win.location.href = url;
}
}

也可以将上述前端代码放入一个js文件中,在需要进行重定向的时候引入即可,便可以实现更高的代码复用率。

redirect.js

function redirectHandle(xhr) {
var url = xhr.getResponseHeader("redirectUrl");
console.log("redirectUrl = " + url);
var enable = xhr.getResponseHeader("enableRedirect");
if((enable == "true") && (url != "")){
var win = window;
while(win != win.top){
win = win.top;
}
win.location.href = url;
}
}
$(function () {
$(document).ajaxComplete(function (event, xhr, settings) {
console.log("ajaxComplete adffdafadsaf")
redirectHandle(xhr);
})
})

引入js文件,src根据据实际情况设置。

<script src="/common/redirect.js"></script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
Jan 05 Javascript
javascript 拖放效果实现代码
Jan 22 Javascript
JavaScript Event事件学习第一章 Event介绍
Feb 07 Javascript
js实现div闪烁原理及实现代码
Jun 24 Javascript
jquery简单插件制作(fn.extend)完整实例
May 24 Javascript
Highcharts学习之数据列
Aug 03 Javascript
vue-resource 拦截器(interceptor)的使用详解
Jul 04 Javascript
vue弹窗消息组件的使用方法
Sep 24 Javascript
JavaScript类型相关的常用操作总结
Feb 14 Javascript
layui输入框中只允许输入整数的实现方法
Sep 18 Javascript
d3.js实现图形拖拽
Dec 19 Javascript
Flexible.js可伸缩布局实现方法详解
Nov 13 Javascript
vue配置文件实现代理v2版本的方法
Jun 21 #Javascript
微信小程序自定义多列选择器使用详解
Jun 21 #Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
Jun 21 #Javascript
Vue多环境代理配置方法思路详解
Jun 21 #Javascript
微信小程序实现卡片层叠滑动效果
Jun 21 #Javascript
使用express来代理服务的方法
Jun 21 #Javascript
react+redux仿微信聊天界面
Jun 21 #Javascript
You might like
类的另类用法--数据的封装
2006/10/09 PHP
PHP实现文件上传下载实例
2016/10/18 PHP
PHP三种方式实现链式操作详解
2017/01/21 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
JavaScript 高级语法介绍
2009/06/15 Javascript
Array.prototype.slice.apply的使用方法
2010/03/17 Javascript
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
jQuery提交表单ajax查询实例代码
2012/10/07 Javascript
jQuery实现新消息闪烁标题提示的方法
2015/03/11 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
AngularJS中watch监听用法分析
2016/11/04 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
2016/11/04 Javascript
原生JavaScript实现AJAX、JSONP
2017/02/07 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
深入讲解Python编程中的字符串
2015/10/14 Python
Python数据类型详解(四)字典:dict
2016/05/12 Python
浅谈Python中的私有变量
2018/02/28 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
wxPython的安装与使用教程
2018/08/31 Python
python 拼接文件路径的方法
2018/10/23 Python
使用python 打开文件并做匹配处理的实例
2019/01/02 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
在python中使用nohup命令说明
2020/04/16 Python
超级实用的8个Python列表技巧
2020/08/24 Python
HTML5 移动页面自适应手机屏幕四类方法总结
2017/08/17 HTML / CSS
PHP开发工程师面试问题集锦
2012/11/01 面试题
车间主任岗位职责
2014/03/16 职场文书
群众路线教育实践活动的心得体会
2014/09/03 职场文书
护士长2014年终工作总结
2014/11/11 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
MBA推荐信怎么写
2015/03/25 职场文书
Redis 哨兵集群的实现
2021/06/18 Redis
Pandas数据结构之Series的使用
2022/03/31 Python