我正在使用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在这一点上非常简单和基本)。
热烈欢迎任何想法的想法或建议!
答案 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