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 相关文章推荐
js 表格隔行颜色
Dec 02 Javascript
js获取浏览器的可视区域尺寸的实现代码
Nov 30 Javascript
javascript实现禁止复制网页内容
Dec 16 Javascript
Jquery为DIV添加click事件的简单实例
Jun 02 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
Jun 21 Javascript
jQuery继承extend用法详解
Oct 10 Javascript
nuxt框架中路由鉴权之Koa和Session的用法
May 09 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
Aug 25 Javascript
node爬取新型冠状病毒的疫情实时动态
Feb 06 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
Mar 11 Javascript
JavaScript中继承原理与用法实例入门
May 09 Javascript
angular4实现带搜索的下拉框
Mar 25 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基于curl实现的股票信息查询类实例
2016/11/11 PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
2017/07/10 PHP
详解强大的jQuery选择器之基本选择器、层次选择器
2012/02/07 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
escape函数解决js中ajax传递中文出现乱码问题
2014/10/30 Javascript
Jquery使用val方法读写value值
2015/05/18 Javascript
Jquery简单分页实现方法
2015/07/24 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
深入理解JavaScript 函数
2016/06/06 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
bootstrap table小案例
2016/10/21 Javascript
jQuery实现的上传图片本地预览效果简单示例
2018/03/29 jQuery
JavaScript+H5实现微信摇一摇功能
2018/05/23 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
vue实现多个元素或多个组件之间动画效果
2018/09/25 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
swiper实现导航滚动效果
2020/12/13 Javascript
[03:43]2014DOTA2西雅图国际邀请赛 newbee战队巡礼
2014/07/07 DOTA
python实现数值积分的Simpson方法实例分析
2015/06/05 Python
python实现中文分词FMM算法实例
2015/07/10 Python
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
在django中使用自定义标签实现分页功能
2017/07/04 Python
python之信息加密题目详解
2019/06/26 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
python实现数字炸弹游戏
2020/07/17 Python
python request 模块详细介绍
2020/11/10 Python
Guess荷兰官网:美国服饰品牌
2020/01/22 全球购物
法学专业应届生求职信
2013/10/16 职场文书
运动会通讯稿50字
2014/01/30 职场文书
光盘行动倡议书
2014/02/02 职场文书
办公室员工岗位工作职责
2014/03/10 职场文书
《特殊的葬礼》教学反思
2014/04/27 职场文书
倡议书范文大全
2015/04/28 职场文书
2015年学校办公室主任工作总结
2015/07/20 职场文书
Go语言空白表示符_的实例用法
2021/07/04 Golang
MySQL表锁、行锁、排它锁及共享锁的使用详解
2022/04/02 MySQL