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模拟类继承小例子
Jul 17 Javascript
javascript检测页面是否缩放的小例子
May 16 Javascript
jquery validation验证身份证号,护照,电话号码,email(实例代码)
Nov 06 Javascript
jquery插件jquery倒计时插件分享
Dec 27 Javascript
js+CSS实现弹出居中背景半透明div层的方法
Feb 26 Javascript
jquery模拟进度条实现方法
Aug 03 Javascript
JavaScript中eval()函数用法详解
Dec 14 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
May 11 Javascript
基于webpack 实用配置方法总结
Sep 28 Javascript
利用React Router4实现的服务端直出渲染(SSR)
Jan 07 Javascript
node.js实现微信开发之获取用户授权
Mar 18 Javascript
JavaScript实现两个数组的交集
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 中英文语言转换类
2011/09/07 PHP
windows下安装php的memcache模块的方法
2015/04/07 PHP
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
无缝滚动改进版支持上下左右滚动(封装成函数)
2012/12/04 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
setTimeout自动触发一个js的方法
2014/01/15 Javascript
JQuery与Ajax调用新浪API获取短网址的代码
2014/02/07 Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
2015/03/26 Javascript
跟我学习javascript的prototype,getPrototypeOf和__proto__
2015/11/17 Javascript
跟我学习javascript的执行上下文
2015/11/18 Javascript
理解javascript对象继承
2016/04/17 Javascript
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
2016/05/18 Javascript
JS实现页面数据无限加载
2016/09/13 Javascript
多种方式实现js图片预览
2016/12/12 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
Vee-Validate的使用方法详解
2017/09/22 Javascript
详解vue-meta如何让你更优雅的管理头部标签
2018/01/18 Javascript
vue-cli的工程模板与构建工具详解
2018/09/27 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
微信小程序版本自动更新的方法
2019/06/14 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
探寻python多线程ctrl+c退出问题解决方案
2014/10/23 Python
pygame学习笔记(6):完成一个简单的游戏
2015/04/15 Python
Python实现mysql数据库更新表数据接口的功能
2017/11/19 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
在Pycharm中修改文件默认打开方式的方法
2019/01/17 Python
python读取有密码的zip压缩文件实例
2019/02/08 Python
Win10系统下安装labelme及json文件批量转化方法
2019/07/30 Python
Python如何输出百分比
2020/07/31 Python
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
戴森西班牙官网:Dyson西班牙
2020/02/04 全球购物
什么是接口(Interface)?
2013/02/01 面试题
多媒体专业自我鉴定
2014/02/28 职场文书
12岁生日演讲稿
2014/05/14 职场文书
店铺转让协议书(2014版)
2014/09/23 职场文书
2015年仓库管理工作总结
2015/05/25 职场文书