在java servlet中处理“multipart / related”

时间:2017-09-03 11:00:37

标签: java xml servlets jetty

在Jetty 8下运行的Servlet收到以下请求:

Header:
Content-Type = multipart/related; boundary=example

Data:

--example
content-type: text/xml; charset=UTF-8

data1here

--example
content-type: text/xml; charset=UTF-8

data2here

--example--
  • 是否有方便的方法从这种请求中获取“data1here”和“data2here”?
  • Java servlet本身是否支持它?
  • 或者是否有其他支持它的库?

2 个答案:

答案 0 :(得分:6)

使用注释

Consume使用Apache CXF提供的JAX-RS注释事件:

@Consumes("multipart/related")

来自JAX-RS文档:

  

现在可以(从2.2.5开始)通过已注册的JAX-RS MessageBodyReaders读取单个multipart/form-data部分,这些内容已经可以用于multipart/mixed或{{1}等类型}。

另见:

请注意,GlassFish使用的Jersey在其source code中未提及multipart/related

HTTP客户端

Google为API提供HTTP client,根据RFC分析related条消息。

RestEasy的

RESTeasy项目可以通过JAX-RS解析multipart/related内容。

JavaMail API

通过一些流扭曲,可以使用JavaMail API来解析MimeMultipart消息:

  

默认的多部分子类型为"混合"。其他多部分子类型,例如" alternative","相关"等等,可以实现为MimeMultipart的子类,并使用其他方法来实现该类型的多部分内容的附加语义

JavaMail FAQ提供了更多详细信息:

  

如上所述,还有更复杂的案例需要考虑。特别是,消息可能具有multipart/relatedmultipart/mixed部分的任意嵌套,并且可能包含multipart/alternative部分用于嵌入式HTML和multipart/related和/或multipart/signed部分以确保安全消息。

我建议反对这种方法,因为它混合了隐喻(它将MIME / HTTP上的MIME与SMTP /邮件上的MIME混为一谈)。也就是说,JavaMail在概念上用于通过SMTP / IMAP读取和写入消息,这可能会让未来的维护者想知道为什么使用JavaMail来解析通过Servlet接收的MIME消息,特别是当有基于注释的解决方案时。也就是说,记录代码及其使用原因是避免混淆的一种方法。

容器

根据容器的不同,它可能会也可能不会处理所有相关的RFC。您可能必须尝试(或仔细阅读)不同容器的源代码,以查看实现此功能的内容。

码头

source code有几个与解析输入流相关的点,仅限于multipart/encrypted

此外,unit tests不包含RFC 2387,这是容器无法处理Servlet 3.0 API下的multipart/form-data部分的强烈指示。因此,JAX-RS可能是最好的方法。

Tomcat的

Tomcat将not implemented related作为Servlet 3.0规范的一部分,尽管存在Tomcat 7.0.47的修补版本。

答案 1 :(得分:-2)

您可以使用JavaMail库并以“mail”方式读取数据。最终得到一个MimeMessage,可以通过BodyParts进行处理。用法非常简单,我使用这种方法来实现AS2服务器,我看到AS2的其他实现也是如此,所以这是一种非常常见的方法。

我不认为这里存在标准冲突。整个请求格式是MIME,因此处理用于处理MIME编码消息的库处理它是我处理事情的正确方法。