Ajax請(qǐng)求時(shí)無(wú)法重定向的問(wèn)題解決代碼詳解
前言
今天發(fā)現(xiàn),當(dāng)使用Ajax請(qǐng)求時(shí),如果后臺(tái)進(jìn)行重定向到其他頁(yè)面時(shí)是無(wú)法成功的,只能在瀏覽器地址欄輸入才能夠?qū)崿F(xiàn)重定向。
Ajax默認(rèn)就是不支持重定向的,它是局部刷新,不重新加載頁(yè)面。
需要實(shí)現(xiàn)的功能是,后臺(tái)網(wǎng)關(guān)攔截請(qǐng)求,看請(qǐng)求中是否存在token.如果不存在就跳轉(zhuǎn)到登錄頁(yè)面。因?yàn)榇蠖鄶?shù)請(qǐng)求都是使用Ajax.一開始發(fā)現(xiàn)無(wú)法進(jìn)行重定向,每次都是返回到Ajax的結(jié)果處理函數(shù)。最終的解決辦法如下,需要后臺(tái)和前端進(jìn)行處理。
后臺(tái):
/** *功能描述 * @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請(qǐng)求 if("XMLHttpRequest".equals(ctx.getRequest().getHeader("X-Requested-With"))){ log.debug("ajax redirect"); sendRedirect(ctx.getResponse(),redirectUrl); } //如果是瀏覽器地址欄請(qǐng)求 else { log.debug("normal redirect "); ctx.getResponse().sendRedirect(redirectUrl); } } catch(Exception ex){ ex.printStackTrace(); } } /** *功能描述 * @author lgj * @Description Ajax請(qǐng)求時(shí)重定向處理 * @date 2/27/19 * @param: * @return: * */ private static void sendRedirect(HttpServletResponse response, String redirectUrl){ try { //這里并不是設(shè)置跳轉(zhuǎn)頁(yè)面,而是將重定向的地址發(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) }, //請(qǐng)求完成調(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è)問(wèn)題就是,每個(gè)ajax都需要編寫 comlete 方法,代碼復(fù)用率低。
第二種方法 : 使用全局的complete方法
ajax請(qǐng)求
$("#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 請(qǐng)求完成之后都會(huì)執(zhí)行。 $(document).ajaxComplete(function (event, xhr, settings) { console.log("ajaxComplete ") redirectHandle(xhr); })
function redirectHandle(xhr) { //獲取后臺(tái)返回的參數(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>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Springboot解決ajax+自定義headers的跨域請(qǐng)求問(wèn)題
- jquery實(shí)現(xiàn)Ajax請(qǐng)求的幾種常見(jiàn)方式總結(jié)
- Ajax請(qǐng)求跨域問(wèn)題解決方案分析
- 在Web關(guān)閉頁(yè)面時(shí)發(fā)送Ajax請(qǐng)求的實(shí)現(xiàn)方法
- 詳解Spring Boot 2.0.2+Ajax解決跨域請(qǐng)求的問(wèn)題
- Flask框架踩坑之a(chǎn)jax跨域請(qǐng)求實(shí)現(xiàn)
- jQuery實(shí)現(xiàn)ajax的嵌套請(qǐng)求案例分析
相關(guān)文章
JS實(shí)現(xiàn)含有中文字符串的友好截取功能分析
這篇文章主要介紹了JS實(shí)現(xiàn)含有中文字符串的友好截取功能,結(jié)合實(shí)例形式分析了JS針對(duì)含有中文的字符串截取操作相關(guān)原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-03-03javascript實(shí)現(xiàn)懸浮跟隨框緩動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)懸浮跟隨框緩動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03JavaScript通過(guò)HTML的class來(lái)獲取HTML元素的方法總結(jié)
除了getElementsByClassName()函數(shù),我們可以自己動(dòng)手編寫程式來(lái)通過(guò)class獲取元素,接下來(lái)我們整理了一下JavaScript通過(guò)HTML的class來(lái)獲取HTML元素的方法總結(jié),需要的朋友可以參考下2016-05-05javascript通過(guò)class來(lái)獲取元素實(shí)現(xiàn)代碼
javascript獲取元素有很多的方法,本文簡(jiǎn)單的介紹下通過(guò)class獲取元素的實(shí)現(xiàn)代碼,感興趣的朋友可以參考下,希望本文知識(shí)點(diǎn)可以幫助到你2013-02-02微信web端后退強(qiáng)制刷新功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了微信web端后退強(qiáng)制刷新功能的實(shí)現(xiàn)代碼,需要的朋友可以參考下2018-03-03javascript 小數(shù)取整簡(jiǎn)單實(shí)現(xiàn)方式
這篇文章主要介紹了javascript 小數(shù)取整d的簡(jiǎn)單實(shí)現(xiàn)方式,需要的朋友可以參考下2014-05-05js實(shí)現(xiàn)簡(jiǎn)易購(gòu)物車功能
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)簡(jiǎn)易購(gòu)物車功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10JavaScript 獲取事件對(duì)象的注意點(diǎn)
平時(shí)我們獲取事件對(duì)象一定要將firefox考慮進(jìn)去。2009-07-07利用ES6實(shí)現(xiàn)單例模式及其應(yīng)用詳解
單例是在程序設(shè)計(jì)非常基礎(chǔ)的東西,這篇文章主要給大家介紹了關(guān)于利用ES6實(shí)現(xiàn)單例模式及其應(yīng)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12