我正在使用WinXP,Eclipse Indigo和Google web插件的webapp。Servlet的sendRedirect()殺死我的會話屬性
我有一個簡單的表單,它從用戶(例如電子郵件)獲取一個值,並將其傳遞給一個名爲SignIn.java
的servlet,該servlet處理它並將電子郵件值保存到會話中。 的SignIn
代碼很簡單,這裏是它的主要doGet
做:
String email = req.getParameter("email"); //getting the parameter from html form
...
...
HttpSession session = req.getSession(); //create a new session
session.setAttribute("email", email);
到目前爲止好,我已經驗證該值不null
在這一點上。現在出現這個問題,我想重定向到另一個需要做更多處理的servlet(ShowOnline.java
)。當我寫
resp.sendRedirect(resp.encodeRedirectURL("/ShowOnlineServlet"));
ShowOnline
得到null
會話值(相同的電子郵件屬性我保存了第二個是現在擺在null
)
當我寫
getServletConfig().getServletContext().getRequestDispatcher("/ShowOnlineServlet");
一切都OK,電子郵件屬性從前不是null
!
這是怎麼回事? sendRedirect()
只是讓你的瀏覽器發送一個新的請求,它不應該影響會話範圍。我檢查了這些cookie,它們都沒問題(它確實是和以前相同的會話,因爲它是我的Web應用程序創建的第一個也是唯一的會話,此外我甚至打擾並檢查了sesison ID,它們在兩個請求中都是相同的) 。
爲什麼sendRedirect()
和forward()
之間有區別?簡單的解決方案是使用forward()
,但我想在放下之前先深入到底,我認爲了解發生的事情對我來說很重要。我不確定我喜歡不知道這些基本概念上發生了什麼的想法(因爲我是初學者,所以我的整個webapp非常簡單和基本)。
任何想法的想法或建議將受到熱烈歡迎!
我猜有可能在一瞬間向前,而不是使用的sendRedirect但我想以後我會想不用擔心我的會話屬性會去空無緣無故的sendRedirect使用。 –
@home:OP確認前後的會話ID相同。 – BalusC
當您不發送重定向並從瀏覽器手動轉到/ ShowOnlineServlet時會發生什麼? –