【问题标题】:How to clone a detached HttpServletRequest and HttpServletResponse provided by the Servlet Container?如何克隆 Servlet 容器提供的分离的 HttpServletRequest 和 HttpServletResponse?
【发布时间】:2011-03-11 13:36:59
【问题描述】:

我想实现以下逻辑: 当我在主servlet的doService方法(在主web容器线程中)收到HttpServletRequeset和HttpServletResponse时,我启动A、B、C三个线程(由我自己的程序管理的线程)以并行模式处理其他servlet,然后加入每个响应从主线程中的这些servlet,如果我自己的一个线程(假设A线程)工作缓慢,主线程将完成,所以主响应将返回给用户。A线程必须继续正常工作,稍后我将在浏览器端使用AJAX请求A线程的响应。

所以,我想克隆 Servlet Container 提供的 HttpServlettRequest 和 HttpServletResponse,克隆的请求和响应必须分离(容器的 HttpServletTrequest 和 HttpServletResponse 完成后,克隆的请求和响应仍然正常工作)。

从我的代码看来,克隆的请求和响应的行为必须与容器的行为相同。可以遵循和包含。

有什么想法吗?

非常感谢!

L.J.W

【问题讨论】:

  • 你不能。时期。功能需求是什么?然后我们可以提供更适合的答案/建议来实现功能需求。

标签: java servlets


【解决方案1】:

可以通过 HttpServletResponseWrapper 类http://docs.oracle.com/javaee/1.3/api/javax/servlet/http/HttpServletResponseWrapper.html 克隆 HTTP 请求和响应。您可以在 Sun 文档https://web.archive.org/web/20120626033905/http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Servlets8.html 中找到使用示例。

请注意,这是(当时)Sun 为解决此问题而提供的一种解决方法,因为从未计划您可以在提交之前修改请求和响应信息。

您可以使用包装器复制 Http 信息并将其传递给不同的线程。

【讨论】:

    【解决方案2】:

    听起来您需要创建类来充当 HttpRequest 和 HttpResponse 对象的委托,然后将对 on 的引用传递给 Runnable 对象以进行处理。

    有些操作只能对 HttpRequest 对象执行一次(从输入流中读取),委托类必须满足这一点。

    如果 A、B 和 C 线程对 HttpResponse 对象进行冲突更改,不确定您会怎么做。

    我想我不希望将 HttpResponse 对象传递给处理线程,并将用于填充响应的逻辑留在控制 servlet 类中

    【讨论】:

    • 我希望克隆的请求和响应可以分离,所以我不能传递引用(等等,我不能使用 wrap 方法)
    • @LJW:你说的完全没有道理。 “我不能通过引用”那么你一定不是在使用 Java...
    • @L.J.W 您可以想要但不会得到,因为在发送响应时使用响应是未定义的行为。换句话说,它会崩溃,因为流已经(可能)被关闭了)。
    • 我可以实现 Response 来覆盖 getWriter 和 getOutputstream 以避免流关闭问题。但是如何处理包含和转发?这些方法是容器实现 ..如果我实现自己的请求,恐怕容器无法正常处理。
    • 创建一个实现 Response 的类,将实际的(服务器提供的)响应传递给它的构造函数并将其存储在成员变量中。委托类上的所有方法来调用成员变量上的相应方法,只需覆盖您需要更改其功能的方法。这会有帮助吗?
    【解决方案3】:

    我认为您对 HttpServletRequest 的要求很高。一旦请求完成,您不应指望请求对象有任何用途。在大多数情况下,我不建议在 J2EE 容器中使用线程,但这是另一个问题。

    如果您必须并行处理请求,我建议您从请求对象中提取您需要的数据并将其发送到您的线程,并使工作线程大部分 Servlet 无知,但 HttpSession 除外他们可以在其中存储计算值以进行 Ajax 检索。

    【讨论】:

    • 线程必须处理servletrequet和response,我不能发送其他数据类型..
    • @L.J.W 换句话说,您需要实现自定义 HttpRequest 和 HttpResponse 并使用从给定请求和响应中复制的数据对其进行初始化。不要复制流,因为那样行不通。
    【解决方案4】:

    请求和响应类并非设计为可从多个线程克隆或访问。如果你试图这样做,你一定会遇到问题。我建议您重新考虑您的要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-21
      • 2011-01-12
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 2018-06-15
      相关资源
      最近更新 更多