前言
今天發(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.一開(kāi)始發(fā)現(xiàn)無(wú)法進(jìn)行重定向,每次都是返回到Ajax的結(jié)果處理函數(shù)。最終的解決辦法如下,需要后臺(tái)和前端進(jìn)行處理。
后臺(tái):
/***功能描述* @author lgj* @Description 重定向工具類* @date 2/27/19*/@Slf4jpublic 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都需要編寫(xiě) 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ò)。
新聞熱點(diǎn)
疑難解答
圖片精選