[英]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.