【问题标题】:How do I share session state between servlets?如何在 servlet 之间共享会话状态?
【发布时间】:2011-03-03 19:50:19
【问题描述】:

我有一个 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 之间共享会话状态的规则是什么。

雄猫 6

TIA

【问题讨论】:

    标签: tomcat servlets tomcat6 session-state


    【解决方案1】:

    你能检查一下你是否有这个声明:?

    如果你使用 JSP 隐式会话对象来设置一个值,它应该对 servlet 可用。

    不过你的代码看起来是有效的..

    【讨论】:

    • 不,没有这样的声明。据我所知,这不起作用,我对此感到有些困惑。我只是从请求中得到一个空会话对象。
    • 这是 MyObject() 可序列化的吗?
    【解决方案2】:

    不要在 JSP 中设置它。那时可能已经太晚了,因为 JSP 是 HTTP 响应的一部分并且已经提交了响应。每当需要创建新会话时,servlet 容器都需要将会话 cookie 添加到 HTTP 响应标头中。但是当响应已经提交时,这不会发生。根据 servletcontainer,您应该在尝试这样做时在服务器日志中看到 IllegalStateException

    改为在 servlet 中设置它,然后再将请求转发到 JSP(您说它“呈现”JSP 之一)。


    与具体问题无关,如果您需要会话,请不要使用request.getSession(false),只需使用request.getSession()。那些潜在的 NPE 和 nullchecks 很笨拙。在 JSP 中编写原始 Java 代码(使用 scriptlets)也被认为是poor practice

    【讨论】:

    • 感谢您的 scriptlet 建议,我也有同感,但我不认为现在需要对代码进行基本的重新架构,这是需要的。
    • 我使用默认的 JSP servlet 来呈现主页。 PDF servlet 是完全独立的。我不太明白 JSP 是如何提交响应的,因为我正在处理一个完全不同的 servlet。
    • 在发送 HTTP 响应标头时提交响应。您最好的尝试是将 scriptlet 放在 JSP 页面的 very top 中,在模板文本的任何字符/行之前,这些字符/行可能会被发送到客户端,因此可能会强制提交响应.如果这没有帮助,请创建一个在 doGet() 中完成工作的 servlet,然后将请求转发到 JSP 以显示 HTTP 响应(然后更改 URL 以调用该 servlet 而不是 JSP)。
    猜你喜欢
    • 2011-08-16
    • 1970-01-01
    • 2011-11-07
    • 2016-11-02
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多