2015-06-17 29 views
1

我上傳了幾個圖像,用Java編寫的上傳功能。只要上傳過程中有一個gif來顯示進度條。現在,當會話超時時,我將重定向到登錄頁面。重定向沒有發生,雖然位置有正確的網址

if (StringUtils.isNotBlank(request.getQueryString())) { 
     queryString = request.getServletPath() + "?" + request.getQueryString(); 
    } else { 
     queryString = request.getServletPath(); 
    } 

    LOGGER.debug("Query String:" + queryString); 
    if (!StringUtils.equalsIgnoreCase(StringUtils.substringAfterLast(queryString, ApplicationConstants.DOT), 
        ApplicationConstants.JSON)) { 
     request.getSession().setAttribute(ApplicationConstants.QUERY_STRING, queryString); 
    } 
    try { 
     LOGGER.error("In navigateToLandingPage. Redirecting to Failure View:" + this.getFailureView()); 
     response.sendRedirect(request.getContextPath() + "/" + this.getFailureView()); 
     // response.setHeader("Refresh", "5; URL=http://XXXX/login.htm"); 
    } catch (IOException e) { 
     throw new BusinessException("Exception in redirecting", "-1", this.getClass().getCanonicalName(), e); 
    } 

當我在分析瀏覽器通過網絡,我可以看到有302個狀態的響應,也是位置有目的URL,但有些不響應如何得到處理並停留在進度條畫面。我試圖添加 response.setHeader(「Refresh」,「5; URL = http://lXXXXX/login.htm」);如果我手動刷新我登錄頁面上的卡住頁面,我試圖添加 response.setHeader低於重定向,但沒有運氣。 任何人都可以請幫助我解決這個問題。

有一個解決方法,而不是發送302我發送901我正在檢查js和指示登錄哪些工作正常,但我打算使用重定向。

+0

您正在使用AJAX,如果讓302通過瀏覽器處理,不會是JS可見。解決方法如您所描述的那樣返回一個不同的狀態代碼並在js中處理。 –

+0

@ M.Deinum - 謝謝我做到了這一點,正如我上面提到的那樣,我發送了901,而且你是對的,我現在明白了,因爲重新發送了302,我無法在JS上閱讀它。我現在就關閉它:) – user3172272

回答

1

因此,使用JS而不是同步使用Web瀏覽器異步觸發請求?換句話說,你試圖重定向一個ajax請求?

如果您發送重定向作爲對ajax請求的響應,那麼默認情況下XMLHttpRequest將遵循該重定向。即它會重新發送ajax請求到該URL。這顯然不是你所期望的。你想要一個同步重定向,而不是一個異步的。

規範的方法是以某種方式指示ajax引擎,它需要在給定的URL上執行window.location調用。如果您使用JSON或XML作爲數據格式,那麼您可以添加一條特殊指令,然後您的ajax引擎可以檢查該指令。

E.g.在JSON的情況下:

response.getWriter().printf("{redirect:\"%s\"}", url); 
var response = fireAjaxRequestAndGetResponseAsJsonSomehow(); 

if (response.redirect) { 
    window.location = response.redirect; 
    return; 
} 

// Usual process continues here.