如何在servlet之间共享会话状态?

时间:2011-03-03 19:50:20

标签: tomcat servlets tomcat6 session-state

我有一个Web应用程序,其中包含两个servlet,一个用于呈现我的JSP页面,另一个用于生成PDF。我在JSP页面之间使用会话状态,并希望将会话对象传递给PDF servlet。

以下是我在JSP中设置会话值的示例:

MyObject o  = (MyObject)session.getAttribute("my.object");
if (o == null)
{
    o = new MyObject();
    session.setAttribute("my.object", o);
}

然后我从JSP中的链接发送到我的新servlet以生成PDF

<a href="../pdfgen?f=d&t=c" target="_blank">Generate a draft report for review</a>

我以为我可以使用HTTPRequest对象在我的servlet中返回会话,如下所示:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    HttpSession session = request.getSession(false);
    MyObject o = (MyObject) session.getAttribute("my.object");
}

使用上面的代码,我从请求中获得了一个空会话对象。

如果我使用request.getSession(true),我会获得一个会话对象,但当然它在属性my.object中不包含任何内容。

这应该如何运作?有关在servlet之间共享会话状态的规则是什么。

Tomcat 6

TIA

2 个答案:

答案 0 :(得分:1)

您是否可以通过任何机会检查是否有此信息:&lt;%@ page session =“false”%&gt; ?

如果您使用JSP隐式会话对象来设置值,那么它应该可供servlet使用。

您的代码看起来有效..

答案 1 :(得分:0)

不要在JSP中设置它。由于JSP是HTTP响应的一部分并且已经提交了响应,因此可能已经太晚了。每当需要创建新会话时,servlet容器需要将会话cookie添加到HTTP响应头。但是,当响应已经提交时,情况就不会发生。根据servletcontainer的不同,在尝试执行此操作时,您应该在服务器日志中看到IllegalStateException

在将请求转发给JSP(其中一个你说它“呈现”JSP)之前,将它设置在servlet中。


与具体问题无关,请勿在需要会话的情况下使用request.getSession(false),只需使用request.getSession()即可。那些潜在的NPE和零检查是笨拙的。在JSP中编写原始Java代码(使用 scriptlets )也被视为poor practice