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 YUI 读码日记之 YAHOO.util.Dom - Part.3
Mar 22 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
Oct 23 Javascript
JQuery切换显示的效果实例代码
Feb 27 Javascript
早该知道的7个JavaScript技巧
Mar 27 Javascript
对JavaScript中this指针的新理解分享
Jan 31 Javascript
百度地图自定义控件分享
Mar 04 Javascript
AngularJS 2.0新特性有哪些
Feb 18 Javascript
React Native基础入门之调试React Native应用的一小步
Jul 02 Javascript
Vue中Axios从远程/后台读取数据
Jan 21 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
Jun 17 Javascript
微信小程序语音同步智能识别的实现案例代码解析
May 29 Javascript
vue切换菜单取消未完成接口请求的案例
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
如何在PHP中进行身份认证
2006/10/09 PHP
composer.lock文件的作用
2016/02/03 PHP
php实现JWT(json web token)鉴权实例详解
2019/11/05 PHP
JS+CSS制作DIV层可(最小化/拖拽/排序)功能实现代码
2013/02/25 Javascript
js读写json文件实例代码
2014/10/21 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
2017/03/30 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
浅谈vue.js导入css库(elementUi)的方法
2018/03/09 Javascript
详解一个基于react+webpack的多页面应用配置
2019/01/21 Javascript
vue实现动态显示与隐藏底部导航的方法分析
2019/02/11 Javascript
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
react使用CSS实现react动画功能示例
2020/05/18 Javascript
Python中模块string.py详解
2017/03/12 Python
Python标准库之collections包的使用教程
2017/04/27 Python
如何在python中使用selenium的示例
2017/12/26 Python
Python命令行解析模块详解
2018/02/01 Python
python远程连接服务器MySQL数据库
2018/07/02 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
详解python常用命令行选项与环境变量
2020/02/20 Python
HTML5: Web 标准最巨大的飞跃
2008/10/17 HTML / CSS
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
失业者真诚求职信范文
2013/12/25 职场文书
小学数学国培感言
2014/03/10 职场文书
团队精神口号
2014/06/06 职场文书
材料成型及控制工程专业求职信
2014/06/19 职场文书
家庭贫困证明书(3篇)
2014/09/15 职场文书
党的群众路线学习笔记
2014/11/06 职场文书
2014年酒店工作总结范文
2014/11/17 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
2021/05/21 PostgreSQL
浅谈如何提高PHP代码质量之端到端集成测试
2021/05/28 PHP
Redis基本数据类型List常用操作命令
2022/06/01 Redis