2010-06-15 102 views
2

我刚开始研究Java Servlets和JSP,并对会话对象有些困惑。里面一个servlet我有这样的:JSP ::与会话对象混淆

现在
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

您确认您的浏览器配置为支持cookie?重定向返回到客户端,然后返回到服务器。也许cookie丢失了。 – 2010-06-15 21:13:38

+0

你需要启用cookie - 你确定你在做吗? – OpenSource 2010-06-15 21:14:47

+0

@Eyal和@OpenSource:是的。我的浏览器支持cookies。我正在尝试下面给出的一些建议。会回来。 – Legend 2010-06-15 21:21:09

回答

3

使用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

+0

最后一行语法无效,他正在设置一个会话属性,所以它应该在重定向的请求中。 – BalusC 2010-06-15 21:14:31

+0

糟糕,我把arg放在了错误的地方。更新 – 2010-06-15 21:17:09

+0

太棒了!谢谢...它现在可以工作了......但我必须将'forward'改为'forward(request,response)'。 – Legend 2010-06-15 21:39:50

1

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

Java方面:

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

JSP方:

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

这会给你包含字符串bar一个段落。

+1

没有解释原始问题,尽管... – skaffman 2010-06-15 21:16:27

+0

EL适用于+1。刚开始听到一些Java端技术:) – Legend 2010-06-15 21:54:07

+0

@skaffman - 是原始问题(重定向不保留会话信息)GAE特定的?当我想通过使用JBoss + Tomcat保存重定向信息时,我实际上使用会话属性(vs请求属性)。 – 2010-06-16 13:51:08

1

虽然不是最好的方法(我宁愿使用EL ${_session}小脚本),这应该能正常运行。你的问题在别的地方。你正在运行你认为你正在运行的代码吗?你如何编译和部署代码?你是否从给定的例子中修剪得太少了?会话是依赖于域和上下文的,如果你重定向到不同的域和/或上下文,那么将创建一个新的会话。此外,会话由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> 

而且安装一个HTTP标头跟踪器,如FirebugNet面板可能会带来新的见解。 HTTP响应应该包含带有会话ID的Set-Cookie标头,随后的HTTP请求应包含具有相同cookie名称/值的Cookie标头,通常为JSESSIONID,其长十六进制值与this screenshot相似。


更新2:,因为我很惊讶,因为正向显然修正了这个问题,我试图重现这个在Tomcat 6和Glassfish 3,但这种方法的作品完美的两台服务器上。所以我怀疑Appengine使用的容器中存在一个错误,即它在重定向过程中没有正确设置cookie。

作为证据,下面是这证明GlassFish是由Set-Cookie设置cookie由Location发射重定向的屏幕:

alt text

+0

我正在使用Google App Engine框架。在Eclipse创建的项目内写入一些servlet和jsp文件。 – Legend 2010-06-15 21:17:52

+0

刚刚尝试过你的方法。它似乎行为一样。 – Legend 2010-06-15 21:23:49

+1

+1为您的时间。 – Legend 2010-06-15 21:53:32