Servlet的sendRedirect()会终止我的会话属性

时间:2011-11-06 19:44:44

标签: java session servlets attributes

我正在使用WinXP,Eclipse Indigo和Google Web插件中的webapp。

我有一个从用户获取值的简单表单(例如电子邮件),将其传递给名为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");

一切正常,之前的电子邮件属性不是null

发生了什么事? sendRedirect()只是让您的浏览器发送新请求,它不应该影响会话范围。我已经检查了cookie并且它们很好(这是以前的会话,因为它是我的webapp创建的第一个也是唯一一个会话,而且我甚至打扰并检查了sesison ID,并且它们在两个请求中都是相同的)

为什么sendRedirect()forward()之间存在差异?简单的解决方案是使用forward(),但我想在我放手之前找到底线,我认为了解发生的事情对我来说很重要。我不确定我是不是不知道这些基本概念发生了什么的想法(因为我是初学者,我的整个webapp在这一点上非常简单和基本)。

热烈欢迎任何想法的想法或建议!

2 个答案:

答案 0 :(得分:1)

如果您的SignIn servlet仅保存请求参数(电子邮件),那么您也可以使用filter替换servlet,例如SignInFilter

SignInFilter将包含与SignIn servlet相同的逻辑(将请求参数中的电子邮件复制到会话中),但会调用链中的下一个项目(这将是您的{{ 1}} servlet)而不是做任何重定向/前进。

ShowOnline

将表单设置为POST到public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; HttpSession session = request.getSession(); String email = req.getParameter("email"); session.setAttribute("email", email); chain.doFilter(req, res); // continue to 'ShowOnline' } servlet,并将新的SignInFilter配置为在ShowOnline之前执行(为简洁起见,省略了servlet映射)。

ShowOnline

答案 1 :(得分:-2)

据我所知,sendRedirect()只是将控件重定向到另一个页面而不转移相关的请求&父页面的响应对象,但RequestDispatcher(对象)将ServletRequest和ServletResponse分派到路径参数{getServletContext()。getRequestDispatcher(“path”)}中提到的页面,之后您可以将对象转发到该页面或包含对象。因此,通过此容器可以确保他必须使用父页面中的先前请求和响应对象,而不是创建新的请求和响应对象。 特别是如果您使用会话管理,最好的选择是RequestDispatcher。

希望回答这个问题。

致全部: - 如果我错了,请纠正我。

@rs