JSP ::与会话对象混淆

时间:2010-06-15 21:01:08

标签: java google-app-engine jsp servlets

我刚刚开始探索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。有人能告诉我这样做的正确方法吗?至于我想要做什么,我想分享一些会话变量。

3 个答案:

答案 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()确实保留了会话。

请参阅http://www.coderanch.com/t/170618/java-Web-Component-SCWCD/certification/sendRedirect-Vs-requestdispatcher-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>

同样安装像FirebugNet小组这样的HTTP标头跟踪器可能会带来新的见解。 HTTP响应应包含带有会话ID的Set-Cookie标头,后续HTTP请求应包含具有相同cookie名称/值的Cookie标头,通常JSESSIONID具有长十六进制值,如与this screenshot上一样。


更新2:因为我很惊讶,因为一名前锋显然解决了这个问题,我试图在Tomcat 6和Glassfish 3上重现这一点,但这种方法在两台服务器上都能很好地运行。因此,我怀疑Appengine使用的容器中存在一个错误,即在重定向过程中没有正确设置cookie。

作为证据,这是一个屏幕,证明Glassfish通过Set-Cookie 设置Cookie并Location触发重定向:

alt text