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 相关文章推荐
DOM 脚本编程中的兄弟节点
Oct 31 Javascript
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
Mar 21 Javascript
浅谈JavaScript变量的自动转换和语句
Jun 12 Javascript
js倒计时小实例(多次定时)
Dec 08 Javascript
JavaScript 函数的定义-调用、注意事项
Apr 16 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
Jul 17 Javascript
深入研究jQuery图片懒加载 lazyload.js使用方法
Aug 16 jQuery
详解React native全局变量的使用(跨组件的通信)
Sep 07 Javascript
JavaScript原生实现观察者模式的示例
Dec 15 Javascript
Vuex 使用及简单实例(计数器)
Aug 29 Javascript
JS基于对象的链表实现与使用方法示例
Jan 31 Javascript
js实现多张图片每隔一秒切换一张图片
Jul 29 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
PHP投票系统防刷票判断流程分析
2012/02/04 PHP
探讨方法的重写(覆载)详解
2013/06/08 PHP
php获取文件大小的方法
2014/02/26 PHP
解决CodeIgniter伪静态失效
2014/06/09 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
php实现文件预览功能
2017/05/23 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
拖动Html元素集合 Drag and Drop any item
2006/12/22 Javascript
JS中实现replaceAll的方法(实例代码)
2013/11/12 Javascript
js验证输入是否为手机号码或电话号码示例
2013/12/30 Javascript
Iframe 自动适应页面的高度示例代码
2014/02/26 Javascript
jQuery中children()方法用法实例
2015/01/07 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
2015/10/15 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
javaScript嗅探执行神器-sniffer.js
2017/02/14 Javascript
巧用weui.topTips验证数据的实例
2017/04/17 Javascript
vue router demo详解
2017/10/13 Javascript
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
koa2的中间件功能及应用示例
2020/03/05 Javascript
[02:04]2014DOTA2国际邀请赛 BBC小组赛第三天总结
2014/07/12 DOTA
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
浅析python递归函数和河内塔问题
2017/04/18 Python
Python for循环与getitem的关系详解
2020/01/02 Python
Python class的继承方法代码实例
2020/02/14 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
2020/06/30 Python
用python批量移动文件
2021/01/14 Python
英国专业美容产品在线:Mylee(从指甲到脱毛)
2020/07/06 全球购物
班级口号大全
2014/06/09 职场文书
会员活动策划方案
2014/08/19 职场文书
监察局领导班子四风问题整改措施思想汇报
2014/10/05 职场文书
廉政承诺书
2015/01/19 职场文书
新闻稿件写作范文
2015/07/18 职场文书
婚宴来宾致辞
2015/07/28 职场文书
创业计划书之酒厂
2019/10/14 职场文书
Golang 切片(Slice)实现增删改查
2022/04/22 Golang