3

我正在寻找一种方法来获取 Servlet 过滤器中 HTTP 多部分请求的表单参数,而无需上传文件(还)。

request.getParameterMap() 返回空。我知道这是因为请求是多部分的。

我查看了 commons.HttpFileUpload 但这似乎对我的情况来说有点过分了。在这个过滤器中,我只对普通参数感兴趣,还不想处理文件上传。

编辑:主要问题是我需要在过滤器堆栈的下方有一个完整的 HttpRequestObject 。HttpFileUpload 似乎消耗了部分请求数据(可能是通过使用数据流对象并再次关闭它。)

4

4 回答 4

6

这当然不是矫枉过正,它是正确的方法,而且总是比自己编写解析器更好。Apache Commons FileUpload已开发和维护多年,并已证明其在处理多部分/表单数据请求方面的稳健性。你不想重新发明轮子。如果您真的想这样做(我不推荐),请阅读multipart/form-data 规范并开始阅读HttpServletRequest#getInputStream()(警告:这是二进制和字符数据的混合!)。

如有必要,您还可以编写一个过滤器,该过滤器在后台使用 Apache Commons FileUpload 并检查每个请求是否为 multipart/form-data,如果是,则在 Commons FileUpload 的帮助下将参数放回请求参数映射中将上传的文件(或异常)作为请求属性,以便最终在您的 servlet 代码中更加透明。你可以在这里找到一个基本的例子来理解这个想法。

希望这可以帮助。

于 2009-11-17T11:45:41.560 回答
5

只是为了添加已经提供的答案-我遇到了一个非常相似的问题,因为我试图向我们现有的 Web 应用程序添加一些 CSRF 验证。我们决定使用一些 JS 在每个表单中包含一个特殊的标记,并添加一个 servlet 过滤器来检查该标记是否存在(因此是一个通用的、孤立的解决方案)。

servlet 将检查令牌是否存在,但是否会为每个提供文件上传选项的表单中断。因此,我在进行谷歌搜索时经常登陆此页面。

我们使用的解决方法(同时试图避免对上传的文件进行任何处理)是让一些 JavaScript 将令牌添加为 GET 参数,即我们修改了表单的操作 URL 以包含令牌,因此可以使用 HttpServletRequest.getParameter () 方法的令牌(并且只有令牌)。

我已经在 IE、FF 和 Chrome 中对此进行了测试,似乎都很满意。

希望这对那些也发现自己处于类似情况的人有所帮助。

于 2011-10-14T14:09:12.597 回答
4

Oreilly Servlets网站有一些示例代码,您可以下载自定义和使用。这包括MultipartRequest,它听起来像您需要的那样,它取消了多部分请求并允许分别访问参数和文件。

于 2009-11-17T11:50:31.227 回答
1

Commons FileUpload 提供了一种从多部分表单上传中读取请求参数的机制。

这里有一个很好的例子来说明如何获取请求参数:

如何使用 JSP/Servlet 将文件上传到服务器?

于 2013-06-26T16:00:31.600 回答