簡體   English   中英

來自 jsp 的 response.sendRedirect():包括被忽略?

[英]response.sendRedirect() from jsp:include being ignored?

我有一個 jsp 文件,其中包括另一個 jsp 文件來檢查一些值等:

<jsp:include page="setup.jsp" />

在 setup.jsp 中,我有一些條件代碼,用於確定是否在 session 中設置了一些需要的值,如果沒有,則將它們重定向到不同的頁面。 或者至少應該如此,但重定向似乎被忽略了。

System.err.println("Redirecting!");
response.sendRedirect("http://www.google.com");
return;

我看到“重定向”,登錄到控制台。 但頁面繼續並正常呈現。 我讓 curl 為我轉儲了標頭,並看到響應是HTTP/1.1 200 OK ,所以它肯定沒有發送 302 重定向。

知道問題是什么以及如何解決這個問題嗎?

編輯:我已經確認我的回復尚未提交。 response.isCommitted()返回false表示狀態代碼和標頭尚未發送。

編輯 2:我嘗試在許多其他地方調用response.sendRedirect()並發現我可以在之前成功重定向。 JSP 內的重定向似乎被忽略了,如果我嘗試在 jsp 之后正確重定向,那么我會收到一個非法的 state 異常,因為響應已經提交。

<jsp:include>在幕后使用RequestDispatcher#include() 單擊鏈接以查看 javadoc。 這是相關性的摘錄(強調我的):

...

ServletResponse object 的路徑元素和參數與調用者的保持不變。 包含的 servlet 不能更改響應狀態碼或設置標頭; 任何進行更改的嘗試都會被忽略。

...

The HttpServletResponse#sendRedirect() basically sets the HTTP response status to 302 and the HTTP Location header to the target URL. 因此,它完全被忽略了。

更深層次的問題是您濫用 JSP 作為頁面控制器/過濾器。 您實際上應該為此使用普通的servlet過濾器class,它在 JSP 之前運行。

重定向 header (我相信)需要位於頁面頂部。 查看 HTML 規范以供參考。

您是否嘗試將其放在頁面的最頂部? 代碼示例將幫助我們調試...

暫無
暫無

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

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