最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Ajax請求時(shí)無法重定向的問題解決代碼詳解

 更新時(shí)間:2019年06月21日 10:09:44   作者:冬眠的山谷  
這篇文章主要介紹了Ajax請求時(shí)無法重定向的問題解決代碼詳解,當(dāng)使用Ajax請求時(shí),如果后臺進(jìn)行重定向到其他頁面時(shí)是無法成功的,只能在瀏覽器地址欄輸入才能夠?qū)崿F(xiàn)重定向。下面我們來看看解決方法吧

前言

今天發(fā)現(xiàn),當(dāng)使用Ajax請求時(shí),如果后臺進(jìn)行重定向到其他頁面時(shí)是無法成功的,只能在瀏覽器地址欄輸入才能夠?qū)崿F(xiàn)重定向。

Ajax默認(rèn)就是不支持重定向的,它是局部刷新,不重新加載頁面。

需要實(shí)現(xiàn)的功能是,后臺網(wǎng)關(guān)攔截請求,看請求中是否存在token.如果不存在就跳轉(zhuǎn)到登錄頁面。因?yàn)榇蠖鄶?shù)請求都是使用Ajax.一開始發(fā)現(xiàn)無法進(jìn)行重定向,每次都是返回到Ajax的結(jié)果處理函數(shù)。最終的解決辦法如下,需要后臺和前端進(jìn)行處理。

后臺:

/**
*功能描述
* @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請求時(shí)重定向處理
* @date 2/27/19
* @param: 
* @return: 
*
*/
private static void sendRedirect(HttpServletResponse response, String redirectUrl){
try {
       //這里并不是設(shè)置跳轉(zhuǎn)頁面,而是將重定向的地址發(fā)給前端,讓前端執(zhí)行重定向
//設(shè)置跳轉(zhuǎn)地址
response.setHeader("redirectUrl", redirectUrl);
//設(shè)置跳轉(zhuǎn)使能
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)
},
//請求完成調(diào)用
(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; 
          } 
      }, 
    });
})

但是上面有個(gè)問題就是,每個(gè)ajax都需要編寫 comlete 方法,代碼復(fù)用率低。

第二種方法 : 使用全局的complete方法

ajax請求

$("#NON-TOKEN").click(function () {
$.ajax({
type: "post",
url: "/auth/token/check",
success: function(data,status){
console.log("/token/check 返回 status : "+status)
},
});

全局處理

注意這參數(shù)(event, xhr, settings)不能少,否則會(huì)報(bào)錯(cuò)。

//每一個(gè)Ajax 請求完成之后都會(huì)執(zhí)行。
$(document).ajaxComplete(function (event, xhr, settings) {
console.log("ajaxComplete ")
redirectHandle(xhr);
})
function redirectHandle(xhr) {
  //獲取后臺返回的參數(shù)
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;
}
}

也可以將上述前端代碼放入一個(gè)js文件中,在需要進(jìn)行重定向的時(shí)候引入即可,便可以實(shí)現(xiàn)更高的代碼復(fù)用率。

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根據(jù)據(jù)實(shí)際情況設(shè)置。

<script src="/common/redirect.js"></script>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一文詳細(xì)分析前端請求中的“Unsupported?Media?Type”問題

    一文詳細(xì)分析前端請求中的“Unsupported?Media?Type”問題

    在Web開發(fā)中,前后端交互頻繁遇到HTTP狀態(tài)碼415錯(cuò)誤,這表明服務(wù)器無法處理因Content-Type不匹配的請求,常見于POST或PUT請求,必須確保請求頭中的Content-Type與服務(wù)器期望的一致,跨域請求中,需要的朋友可以參考下
    2024-10-10
  • 詳解JavaScript的懶加載是如何實(shí)現(xiàn)的

    詳解JavaScript的懶加載是如何實(shí)現(xiàn)的

    懶加載(Lazy Loading)是一種在軟件開發(fā)中常用的優(yōu)化技術(shù),它主要用于延遲加載資源,直到真正需要使用的時(shí)候才進(jìn)行加載,這樣可以減少初始加載的時(shí)間和資源消耗,并提升用戶體驗(yàn),本文給大家詳細(xì)介紹了JavaScript的懶加載是如何實(shí)現(xiàn)的,需要的朋友可以參考下
    2024-01-01
  • javascript遍歷對象的五種方式實(shí)例代碼

    javascript遍歷對象的五種方式實(shí)例代碼

    在我們?nèi)粘9ぷ鬟^程中,我們對于javaScript遍歷對象、數(shù)組的操作是十分的頻繁的,這篇文章主要給大家介紹了關(guān)于javascript遍歷對象的五種方式,需要的朋友可以參考下
    2021-10-10
  • javascript常用的方法整理

    javascript常用的方法整理

    JAVASCRIPT是AJAX技術(shù)中不可或缺的一部分,所以想學(xué)好AJAX以及現(xiàn)在流行的AJAX框架,學(xué)好JAVASCRIPT是最重要的。這章我給大家整理了一些JAVASCRIPT的基礎(chǔ)知識、常用代碼和事件匯總。
    2015-08-08
  • 了解Javascript的模塊化開發(fā)

    了解Javascript的模塊化開發(fā)

    這篇文章主要介紹了了解Javascript的模塊化開發(fā),本文講解了為什么需要模塊化開發(fā),模塊化開發(fā)的形成原因等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • JavaScript事件學(xué)習(xí)小結(jié)(一)事件流

    JavaScript事件學(xué)習(xí)小結(jié)(一)事件流

    這篇文章主要介紹了JavaScript事件學(xué)習(xí)小結(jié)(一)事件流的相關(guān)資料,需要的朋友可以參考下
    2016-06-06
  • ejs v9 javascript模板系統(tǒng)

    ejs v9 javascript模板系統(tǒng)

    我的模板系統(tǒng)升一下級, 繼續(xù)在新公司里面用。 現(xiàn)在幾在互聯(lián)網(wǎng)公司沒有不用javascript模板了, 什么TX, 百度, 新浪, 360什么的, 最后瀑布流的流行, 里面又有許多用到模板
    2012-03-03
  • javascript實(shí)現(xiàn)json頁面分頁實(shí)例代碼

    javascript實(shí)現(xiàn)json頁面分頁實(shí)例代碼

    這篇文章主要介紹了javascript實(shí)現(xiàn)json頁面分頁實(shí)例代碼,需要的朋友可以參考下
    2014-02-02
  • javascript window.onerror事件學(xué)習(xí)新收獲

    javascript window.onerror事件學(xué)習(xí)新收獲

    javascript window.onerror事件學(xué)習(xí)新收獲...
    2007-11-11
  • Js四則運(yùn)算函數(shù)代碼

    Js四則運(yùn)算函數(shù)代碼

    javascript的除法結(jié)果會(huì)有誤差,在兩個(gè)浮點(diǎn)數(shù)相除的時(shí)候會(huì)比較明顯。這個(gè)函數(shù)返回較為精確的除法結(jié)果
    2012-07-07

最新評論

长岛县| 大邑县| 台北市| 南平市| 南宁市| 新竹市| 镇宁| 团风县| 西宁市| 镇坪县| 莎车县| 东丽区| 策勒县| 商都县| 子长县| 耒阳市| 铜梁县| 黄山市| 门源| 巧家县| 肇源县| 延安市| 洞头县| 广宗县| 昌邑市| 黄陵县| 鄂伦春自治旗| 军事| 山阳县| 克山县| 金阳县| 左云县| 博爱县| 哈密市| 靖州| 资溪县| 衡南县| 华阴市| 柯坪县| 平山县| 霍城县|