我刚刚开始探索Java Servlets和JSP,对于session对象有点困惑。在servlet里面我有这个:
public class SampleServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException {
HttpSession session = request.getSession(true);
session.setAttribute("_session", "_value");
response.sendRedirect("page2.jsp");
}
}
现在,在page2.jsp中,还有一个会话对象,但是当我这样做时
<%
out.print(session.getAttribute("_session"))
%>
它似乎没有得到值(好像它没有设置)。我尝试将布尔属性设置为true,但在jsp页面中它返回false。有人能告诉我这样做的正确方法吗?至于我想要做什么,我想分享一些会话变量。
答案 0 :(得分:4)
使用request.getRequestDispatcher()。forward()而不是response.sendRedirect();
所以你的代码是:
HttpSession session = request.getSession(true);
session.setAttribute("_session", "_value");
request.getRequestDispatcher("page2.jsp").forward();
基本上,response.sendRedirect()不保留会话信息,所以当jsp获取它时它不存在。 request.forward()确实保留了会话。
答案 1 :(得分:1)
假设您的容器支持它,请使用EL!
Java方面:
HttpSession session = request.getSession(true);
session.setAttribute("foo", "bar");
JSP方面:
<html>
...
<body>
...
<p>${foo}</p>
...
</body>
</html>
这会给你一个包含字符串bar
的段落。
答案 2 :(得分:1)
虽然不是最好的方法(我宁愿使用EL ${_session}
而不是 scriptlet ),但这应该可行。你的问题出在其他地方。你在运行你认为正在运行的代码吗?您是如何编译和部署代码的?你没有从给定的例子中削减太多吗?会话依赖于域和上下文,如果您重定向到不同的域和/或上下文,则会创建新会话。此外,会话由cookie支持,浏览器是否启用了cookie?否则,您必须使用HttpServletResponse#encodeRedirectURL()
将会话标识符附加到重定向URL。
response.sendRedirect(response.encodeRedirectURL("page2.jsp"));
更新:调试如果它真的是相同的会话,请在servlet中执行:
System.out.println("Session ID: " + session.getId());
并在JSP中:
<p>Session ID: ${pageContext.session.id}</p>
同样安装像Firebug的Net小组这样的HTTP标头跟踪器可能会带来新的见解。 HTTP响应应包含带有会话ID的Set-Cookie
标头,后续HTTP请求应包含具有相同cookie名称/值的Cookie
标头,通常JSESSIONID
具有长十六进制值,如与this screenshot上一样。
更新2:因为我很惊讶,因为一名前锋显然解决了这个问题,我试图在Tomcat 6和Glassfish 3上重现这一点,但这种方法在两台服务器上都能很好地运行。因此,我怀疑Appengine使用的容器中存在一个错误,即在重定向过程中没有正确设置cookie。
作为证据,这是一个屏幕,证明Glassfish通过Set-Cookie
设置Cookie并按Location
触发重定向: