【问题标题】:Passing a HttpServletRequest Object as a Parameter将 HttpServletRequest 对象作为参数传递
【发布时间】:2023-04-02 22:24:02
【问题描述】:

一般来说,我需要通过调用 servlet 的 html 表单上传一个大文件,然后使用繁重的算法操作该文件并返回一个 xml 文档作为响应。 这整个过程需要很多时间,所以为了避免浏览器超时连接,我决定创建一个对象(扩展Thread),它将执行耗时的过程(上传文件并操作它)在不同的线程,这将能够指示进程的进度。为此,我需要将HttpServletRequest 请求作为参数传递给对象。 当我尝试解析请求参数时(我使用的是apache commons FileUpload),我得到了以下异常:

"the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is null" .

是否可以将HttpServletRequest 对象传递给扩展线程的对象?如果是这样,安全的正确做法是什么?

【问题讨论】:

  • 您的 html 表单是否包含值为 multipart/form-data 的 enctype 属性?
  • 是的。我可以在 doPost 方法中轻松完成,问题是当我将请求作为参数传递时。

标签: java multithreading servlets


【解决方案1】:

你不应该。当在线程中使用请求对象时,请求可能不再有效,Tomcat 可能已经清除了它(因此您的例外)(当然,假设您的表单确实是enctype="multipart/form-data"

所以为了正确处理这个问题,从请求中提取数据并将其传递给新线程。因此,您不会依赖请求对象 - 仅依赖于它的内容。

请注意,Servlet 3.0 添加了一个用于异步服务器端处理的选项,这对您来说似乎是一个不错的选择 - check it out

【讨论】:

  • 感谢您指出异步服务器端处理,我会研究一下。我想防止浏览器等到我从请求中提取文件完成(就像我现在在 doPost 方法中所做的那样),所以我想在不同的线程中执行它。那么是不是不能将请求作为参数传递呢?
  • 简单地从中获取数据应该不会很昂贵,因此获取数据并将其传递给线程。
  • 你能解释一下“请求可能不再有效”吗? Dang,这个答案已经好几年了,可能没人会看到这个评论。
【解决方案2】:

您收到的错误表明客户端的表单可能未正确设置。确保您的表单定义如下:

   <FORM action="YOUR_SERVLET"
   enctype="multipart/form-data"
   method="post">

【讨论】:

  • 确实如此。我在 doPost 方法中很容易做到,问题是当我将请求作为参数传递时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 2017-03-04
  • 2019-10-19
相关资源
最近更新 更多