簡體   English   中英

帶有response.sendRedirect的404

[英]404 with response.sendRedirect

我正在為我的應用程序使用spring安全性登錄機制並測試了所有內容。一切正常,我有以下用例

  1. 如果客戶未登錄,則應用程序會將客戶重定向到登錄頁面。
  2. 成功登錄后,應用程序會將客戶重定向到同一頁面,從該頁面將他們重定向到登錄頁面

這是用於將用戶重定向到其原始位置的Java代碼

final SavedRequest savedRequest = this.requestCache.getRequest(request, response);
targetUrl = savedRequest.getRedirectUrl();
getRedirectStrategy().sendRedirect(request, response, targetUrl);

這里使用的RedirectionStrategy是DefaultRedirectStrategy ,一切正常。 現在,應用程序已部署在Pre Production服務器上,現在似乎無法正常工作,並且出現404錯誤。

當客戶被重定向到主頁時, targetUrl為“ /”,我有一個以此映射命名的Spring控制器

@RequestMapping("/")
public class HomePageController{  // home page code }

我的應用程序當前的Pre-Prod urs是prepd-www.mysite.com因此當sendredirect prepd-www.mysite.com時,網頁URL已更改為prepd-www.mysite.com/prepd-www.mysite.com

我不確定是什么導致了此問題。 是因為代理服務器設置嗎? 有人可以建議我這個問題的可能根源嗎?

我已經在所有本地計算機上以及在我們的質量檢查中都進行了嘗試,但是一切工作正常。

目前針對發生這種情況的環境的設置

  1. 我們有4個應用服務器
  2. 我們有一個負載平衡器,可將流量重定向到其中一台應用程序服務器。

您是在生產前期的tomcat還是其他應用程序服務器中使用的?通常,如果您的戰爭正在調用foo並且您對tomcat進行了提交,則這場戰爭的路徑是

   http://localhost:8080/foo/ 

因此,如果您正在使用servlet,則需要在web.xml中指定主路徑為foo / *。

只是一個大膽的猜測,因為您無法提供反向代理配置,也無法提供預先生產和開發中使用的確切URL。

您說您正在使用Spring安全性中的DefaultRedirectStrategy 該策略具有一個選項(contextRelative),該選項將ServletContext路徑添加到URL。 如果在您的開發系統中使用的是根上下文,即您正在訪問主頁(例如): http://localhost:8080/則Serlet上下文為空。

但是,如果現在處於preprod中,則servlet上下文不再是根目錄,而是說/myApp 曾經由apache反向代理翻譯 ,當您重定向時,您將獲得/myApp/myApp的URL,該URL可以翻譯回您提供的URL。

您可以嘗試控制DefaultRedirectStrategy contextRelative是否為true ,如果可以,則設置為false,還可以控制是否重定向到絕對或相對URL。

如果您在前面使用apache,請檢查apache配置的重寫規則和重定向規則。 最好的方法是直接通過ssh隧道連接到應用程序服務器(通過跳過apache)並進行測試。 如果工作正常,則意味着您的應用程序配置很好,需要在apache中進行修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM