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 相关文章推荐
select 控制网页内容隐藏于显示的实现代码
May 25 Javascript
js弹出窗口之弹出层的小例子
Jun 17 Javascript
jquery 按键盘上的enter事件
May 11 Javascript
JavaScript中使用arguments获得函数传参个数实例
Aug 27 Javascript
js 左右悬浮对联广告代码示例
Dec 12 Javascript
jQuery简单实现禁用右键菜单
Mar 10 Javascript
JSON 对象未定义错误的解决方法
Sep 29 Javascript
详解vue的数据binding绑定原理
Apr 12 Javascript
原生JavaScrpit中异步请求Ajax实现方法
Nov 03 Javascript
详解基于vue-cli配置移动端自适应
Jan 13 Javascript
使用vue中的v-for遍历二维数组的方法
Mar 07 Javascript
Vue数字输入框组件的使用方法
Oct 19 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
弄了个检测传输的参数是否为数字的Function
2006/12/06 PHP
Yii2使用自带的UploadedFile实现的文件上传
2016/06/20 PHP
php 使用curl模拟ip和来源进行访问的实现方法
2017/05/02 PHP
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
2014/12/20 Javascript
简介JavaScript中getUTCMonth()方法的使用
2015/06/10 Javascript
jQuery插件zepto.js简单实现tab切换
2015/06/16 Javascript
jQuery实现鼠标选文字发新浪微博的方法
2016/04/02 Javascript
Google 地图API Map()构造器详解
2016/08/06 Javascript
JavaScript组合模式学习要点
2016/08/26 Javascript
jQuery操作复选框(CheckBox)的取值赋值实现代码
2017/01/10 Javascript
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
理解javascript async的用法
2017/08/22 Javascript
Vue下的国际化处理方法
2017/12/18 Javascript
JQuery选中select组件被选中的值方法
2018/03/08 jQuery
Node.js开发之套接字(socket)编程入门示例
2019/11/05 Javascript
js键盘事件实现人物的行走
2020/01/17 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
python通过自定义isnumber函数判断字符串是否为数字的方法
2015/04/23 Python
Python中的ConfigParser模块使用详解
2015/05/04 Python
使用Python+Splinter自动刷新抢12306火车票
2018/01/03 Python
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
python之信息加密题目详解
2019/06/26 Python
python自动结束mysql慢查询会话的实例代码
2019/10/27 Python
Python 模拟动态产生字母验证码图片功能
2019/12/24 Python
详解CSS3的box-shadow属性制作边框阴影效果的方法
2016/05/10 HTML / CSS
使用HTML5 Geolocation实现一个距离追踪器
2018/04/09 HTML / CSS
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
SQL注入攻击的种类有哪些
2013/12/30 面试题
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
学校做一个有道德的人活动方案
2014/08/23 职场文书
小学秋季运动会通讯稿
2015/11/25 职场文书
旅游安全责任协议书
2016/03/22 职场文书
python中super()函数的理解与基本使用
2021/08/30 Python
Fluentd搭建日志收集服务
2022/09/23 Servers