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显示当前时间示例
Mar 02 Javascript
jQuery事件用法实例汇总
Aug 29 Javascript
angularJS 中$scope方法使用指南
Feb 09 Javascript
js实现图片轮播效果
Dec 19 Javascript
js实现文字垂直滚动和鼠标悬停效果
Dec 31 Javascript
浅谈JS验证表单文本域输入空格的问题
Feb 14 Javascript
jQuery插件zTree实现清空选中第一个节点所有子节点的方法
Mar 08 Javascript
详解vue 配合vue-resource调用接口获取数据
Jun 22 Javascript
Django+Vue跨域环境配置详解
Jul 06 Javascript
vue两组件间值传递 $router.push实现方法
May 15 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
Apr 15 Javascript
比较node.js和Deno
Apr 27 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设计模式之单例模式使用示例
2014/01/20 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
2016/04/22 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
JavaScript版TAB选项卡效果实例
2013/08/16 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
2016/04/21 Javascript
JS实现的手机端精简幻灯片效果
2016/09/05 Javascript
jQuery EasyUI 页面加载等待及页面等待层
2017/02/06 Javascript
Bootstrap面板学习使用
2017/02/09 Javascript
jQuery插件zTree实现删除树子节点的方法示例
2017/03/08 Javascript
JavaScript截屏功能的实现代码
2017/07/28 Javascript
详解Vue微信公众号开发踩坑全记录
2017/08/21 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项小结【实例代码】
2018/11/20 Javascript
微信小程序网络层封装的实现(promise, 登录锁)
2019/05/08 Javascript
[38:21]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS Newbee
2018/03/31 DOTA
Python中在脚本中引用其他文件函数的实现方法
2016/06/23 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
有关Tensorflow梯度下降常用的优化方法分享
2020/02/04 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
Python类class参数self原理解析
2020/11/19 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
CSS3 透明色 RGBA使用介绍
2013/08/06 HTML / CSS
详解HTML5 Canvas绘制时指定颜色与透明度的方法
2016/03/25 HTML / CSS
海淘母婴商城:国际妈咪
2016/07/23 全球购物
大学本科生的个人自我评价
2013/12/09 职场文书
工程承包协议书
2014/04/22 职场文书
4s店活动策划方案
2014/08/25 职场文书
放飞梦想演讲稿200字
2014/08/26 职场文书
办公室文员工作自我鉴定
2014/09/19 职场文书
个人汇报材料范文
2014/12/30 职场文书
装修安全责任协议书
2016/03/22 职场文书
python 经纬度求两点距离、三点面积操作
2021/06/03 Python
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
2022/04/03 MySQL