我正在使用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时会发生什么? –