Java 与会话对象混淆

Java 与会话对象混淆,java,google-app-engine,jsp,servlets,Java,Google App Engine,Jsp,Servlets,我刚开始研究Javaservlet和JSP,对sessions对象有点困惑。在servlet中,我有以下内容: public class SampleServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { HttpSession session = request

我刚开始研究Javaservlet和JSP,对sessions对象有点困惑。在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。有人能告诉我这样做的正确方法吗?至于我想做什么,我想分享一些会话变量。

假设您的容器支持它,请使用

Java方面:

HttpSession session  = request.getSession(true);
session.setAttribute("foo", "bar");
JSP端:

<html>
    ...
    <body>
        ...
        <p>${foo}</p>
        ...
    </body>
</html>

...
...
${foo}

...

这将为您提供一个包含字符串
bar

的段落,使用request.getRequestDispatcher().forward()代替response.sendRedirect()

所以你的代码应该是:

 HttpSession session = request.getSession(true);
 session.setAttribute("_session", "_value");
 request.getRequestDispatcher("page2.jsp").forward();     
基本上,response.sendRedirect()不保留会话信息,因此当jsp获取会话信息时,会话信息就不存在了。request.forward()会保留会话


请参见

尽管这不是最好的方法(我宁愿使用EL
${u session}
而不是scriptlet),但它应该可以正常工作。你的问题在别的地方。你在运行你认为正在运行的代码吗?您是如何编译和部署代码的?你不是从给定的例子中删去了太多内容吗?会话即依赖于域和上下文,如果重定向到其他域和/或上下文,则将创建新会话。此外,会话由cookie支持,浏览器是否启用了cookie?否则,必须使用将会话标识符附加到重定向URL

response.sendRedirect(response.encodeRedirectURL("page2.jsp"));

更新:要调试它是否真的是同一个会话,请在servlet中执行以下操作:

System.out.println("Session ID: " + session.getId());
在JSP中:

<p>Session ID: ${pageContext.session.id}</p>
会话ID:${pageContext.Session.ID}

此外,安装一个HTTP头跟踪器,如的面板,可能会带来新的见解。HTTP响应应该包括一个带有会话ID的
Set Cookie
头,后续HTTP请求应该包括一个带有相同Cookie名称/值的
Cookie
头,通常是带有长十六进制值的
JSESSIONID
,如on


更新2:因为转发显然解决了这个问题,我感到很惊讶,所以我尝试在Tomcat 6和Glassfish 3上复制这个问题,但这种方法在两台服务器上都非常有效。所以我怀疑Appengine使用的容器中有一个bug,它在重定向过程中没有正确设置cookie

作为证据,这里有一个屏幕证明Glassfish通过
设置cookie设置cookie,并通过
位置触发重定向:


您确定您的浏览器已配置为支持cookie吗?重定向返回到客户端,然后返回到服务器。可能cookie丢失了。您需要启用cookie-您确定正在这样做吗?@Eyal和@OpenSource:是。我的浏览器支持cookies。我正在尝试下面给出的一些建议。将返回。在以后的问题中,您应该提前提到您正在使用GAE,它使事情变得不同,在许多情况下会产生不同。最后一行在语法上无效,他正在设置会话属性,因此它应该在重定向请求中。太棒了!谢谢它现在起作用了。。。我不得不将
forward
更改为
forward(请求、响应)
。@图例:这可能与容器有关。您最初的方法在Tomcat6和Glassfish 3上都很好。我测试过了。这可能是Google Appengine使用的容器中的一个bug。@BalusC:谢谢您的澄清。我将提出一个错误报告与谷歌,因为我可以复制它。我使用谷歌应用程序引擎框架。在Eclipse创建的项目中编写一些servlet和jsp文件。刚刚开始听一些Java端技术:)@skaffman-最初的问题(重定向不保留会话信息)是GAE特有的吗?当我想使用JBoss+Tomcat在重定向中保留信息时,我实际上使用了会话属性(vs请求属性)。