从多部分请求获取表单参数而不获取文件

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

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

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

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

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

您可以根据需要编写一个filter,它使用Apache Commons FileUpload并检查每个请求是否为multipart / form-data,如果是,则在Commons FileUpload的帮助下将参数放回请求参数映射中。将上传的文件(或exception)作为请求属性放置,以便最终在servlet代码中更透明。 你可以在这里找到一个基本的例子来获得这个想法。

希望这可以帮助。

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

只是为了添加已经提供的答案 – 我遇到了一个非常类似的问题,我试图在现有的Web应用程序中添加一些CSRFvalidation。 我们决定使用一些JS在每个表单中包含一个特殊标记,并添加一个servletfilter来检查该标记是否存在(因此是一个通用的隔离解决方案)。

servlet将检查令牌是否存在但是为每个提供文件上载选项的表单都打破了。 因此,我在做谷歌搜索时经常登陆这个页面。

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

我已经在IE,FF和Chrome中对此进行了测试,所有人似乎都很高兴。

希望这有助于任何发现自己处于类似情况的人。

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

这里有一个非常好的例子来获取请求参数:

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