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 相关文章推荐
ajax 缓存 问题 requestheader
Aug 01 Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
Apr 14 Javascript
JavaScript中字符串(string)转json的2种方法
Jun 25 Javascript
js实现的tab标签切换效果代码分享
Aug 25 Javascript
简单实现轮播图效果的实例
Jul 15 Javascript
微信小程序入门教程
Nov 18 Javascript
JavaScript队列函数和异步执行详解
Jun 19 Javascript
vue2.0中click点击当前li实现动态切换class
Jun 21 Javascript
Vue2.0 多 Tab切换组件的封装实例
Jul 28 Javascript
关于Ajax的原理以及代码封装详解
Sep 08 Javascript
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
Sep 19 Javascript
基于Vue全局组件与局部组件的区别说明
Aug 11 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中利用XML技术构造远程服务(上)
2006/10/09 PHP
一个PHP数组应该有多大的分析
2009/07/30 PHP
elgg 获取文件图标地址的方法
2010/03/20 PHP
防止本地用户用fsockopen DDOS攻击对策
2011/11/02 PHP
修改PHP的memory_limit限制的方法分享
2012/02/21 PHP
Yii框架关联查询with用法分析
2014/12/02 PHP
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
Jquery中删除元素的实现代码
2011/12/29 Javascript
js保留两位小数使用toFixed实现
2013/07/29 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
用headjs来管理和加载js 提高网站加载速度
2016/11/29 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
Express + Session 实现登录验证功能
2017/09/08 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
[03:02]生活中的Dendi之野外度假篇
2016/08/09 DOTA
Python生成随机密码的方法
2017/06/16 Python
Python简单生成随机姓名的方法示例
2017/12/27 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
python使用scrapy发送post请求的坑
2018/09/04 Python
python ddt数据驱动最简实例代码
2019/02/22 Python
Django 响应数据response的返回源码详解
2019/08/06 Python
在python Numpy中求向量和矩阵的范数实例
2019/08/26 Python
HTML5 视频播放(video),JavaScript控制视频的实例代码
2018/10/08 HTML / CSS
IFCHIC台湾:欧美国际设计师品牌
2019/05/18 全球购物
销售高级职员求职信
2013/10/29 职场文书
就业表自我评价分享
2014/02/06 职场文书
运动会方队口号
2014/06/07 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
团队会宣传标语
2014/10/09 职场文书
社区宣传标语口号
2015/12/26 职场文书
关于艺术节的开幕致辞
2016/03/04 职场文书
在CSS中映射鼠标位置并实现通过鼠标移动控制页面元素效果(实例代码)
2021/04/22 HTML / CSS
win10下go mod配置方式
2021/04/25 Golang
Python中json.dumps()函数的使用解析
2021/05/17 Python
解决Pytorch中关于model.eval的问题
2021/05/22 Python