在java servlet中处理“多部分/相关”

2024-01-31

在 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 本身支持它吗?
  • 或者有其他库支持它吗?

消耗注解

Consume http://cxf.apache.org/docs/jax-rs-multiparts.html#JAX-RSMultiparts-Formsandmultiparts使用 JAX-RS 提供的注释的事件阿帕奇CXF http://cxf.apache.org/:

@Consumes("multipart/related")

来自 JAX-RS 文档:

现在(自 2.2.5 起)可以拥有个人multipart/form-data由注册的 JAX-RS MessageBodyReaders 读取的部分,对于类似的类型已经可以做到这一点multipart/mixed or multipart/related.

也可以看看:

  • Spring Boot 多部分/相关 mime 类型支持 https://stackoverflow.com/q/38838926/59087
  • Jersey:如何注册 MultiPartConfigProvider 类 https://stackoverflow.com/q/23982065/59087

请注意,GlassFish 使用的 Jersey 没有提及related in its 源代码 https://github.com/jersey/jersey/blob/master/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/MultiPartMediaTypes.java.

HTTP客户端

谷歌提供了一个API https://cloud.google.com/java/docs/reference/google-http-client/latest/com.google.api.client.http.MultipartContent for an HTTP客户端 https://cloud.google.com/java/docs/reference/google-http-client/latest/overview解析multipart/related消息按照RFC https://www.rfc-editor.org/rfc/rfc1521#section-7.2.2.

RESTeasy

The RESTeasy http://resteasy.jboss.org/项目可以解析multipart/related https://docs.jboss.org/resteasy/2.0.0.GA/userguide/html_single/#MultipartRelated通过 JAX-RS 的内容。

Java邮件API

通过一些流扭曲,可以使用 JavaMail API 来解析Mime多部分 http://docs.oracle.com/javaee/7/api/javax/mail/internet/MimeMultipart.html信息:

默认的多部分子类型是“混合”。其他多部分子类型(例如“替代”、“相关”等)可以实现为 MimeMultipart 的子类,并使用附加方法来实现该类型的多部分内容的附加语义。

The JavaMail 常见问题解答 https://javaee.github.io/javamail/FAQ提供了更多细节:

如上所述,还需要考虑更复杂的情况。特别是,消息可以任意嵌套multipart/mixed and multipart/alternative部分,可能包括multipart/related嵌入 HTML 的部分和multipart/signed and/or multipart/encrypted用于安全消息的部件。

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

容器

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

Jetty

The 源代码 https://github.com/eclipse/jetty.project有一些与解析输入流相关的地方,仅限于multipart/form-data:

  • 多部分过滤器 https://github.com/eclipse/jetty.project/blob/71d5fcf246034dce91cd642d35cdbaace9806329/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java#L146
  • 多部分输入流解析器 https://github.com/eclipse/jetty.project/blob/71d5fcf246034dce91cd642d35cdbaace9806329/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStreamParser.java#L505

此外,单元测试 https://github.com/eclipse/jetty.project/tree/71d5fcf246034dce91cd642d35cdbaace9806329/tests/test-integration/src/test/java/org/eclipse/jetty/test/rfcs不包括RFC 2387 https://www.rfc-editor.org/rfc/rfc2387,这是容器无法处理的强烈指标relatedServlet 3.0 API 下的部分。因此,JAX-RS 可能是最好的方法。

Tomcat

雄猫有未实现 https://bz.apache.org/bugzilla/show_bug.cgi?id=54917 multipart/related作为 Servlet 3.0 规范的一部分,尽管存在 Tomcat 7.0.47 的修补版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在java servlet中处理“多部分/相关” 的相关文章

  • Junit Mockito 测试一切

    我现在正在寻找更多时间但没有结果 请帮忙 这是我要测试的课程 public class DBSelectSchema extends Database private static final Logger LOG Logger getLo
  • 为什么byteArray的长度是22而不是20?

    我们尝试从字符串转换为Byte 使用以下 Java 代码 String source 0123456789 byte byteArray source getBytes UTF 16 我们得到一个长度为 22 字节的字节数组 我们不确定这个
  • 为什么 hibernate 在一张表中保存两个 @OneToMany 列表?

    想象一下使用 Hibernate 和 JPA 的简化代码如下 Entity class C Id GeneratedValue public long id MappedSuperclass abstract class A Id Gene
  • 术语“引用”的起源,如“通过引用传递”

    Java C 语言律师喜欢说他们的语言按值传递引用 这意味着 引用 是调用函数时复制的对象指针 同时 在 C 中 以及 Perl 和 PHP 中更动态的形式 引用是其他名称 或动态情况下的运行时值 的别名 我对这里的词源感兴趣 参考 一词的
  • 如何避免 Java 中的忙旋转

    我有一个多线程应用程序 其中一个线程向另一个线程发送消息 等待线程轮询消息并做出反应 处理锁 像这样 等待线程代码 while true if helloArrived System out println Got hello if bye
  • 如何让 HttpClient 返回状态码和响应正文?

    我试图让 Apache HttpClient 触发 HTTP 请求 然后显示 HTTP 响应代码 200 404 500 等 以及 HTTP 响应正文 文本字符串 重要的是要注意我正在使用v4 2 2因为大多数 HttpClient 示例都
  • 如何使 ScheduledExecutorService 在计划任务取消时自动终止

    我正在使用一个ScheduledExecutorService如果网络连接已打开超过几个小时 则关闭该连接 然而 在大多数情况下 网络连接在超时之前就关闭了 所以我取消了ScheduledFuture 在这种情况下 我还希望执行程序服务终止
  • 解密 TLS 1.2 AES-GCM 数据包

    我正在开发一个 Java 程序来解密TLS 1 2正在使用的会话TLS RSA WITH AES 128 GCM SHA256密码 我使用wireshark 录制了一个测试会话 这大师秘密是已知的 No Time Protocol Leng
  • 将 RequestBody json 转换为对象 - Spring Boot

    我是 java 开发的初学者 但之前有 PHP 和 Python 等编程语言的经验 对于如何进行 Spring Boot 的开发几乎没有什么困惑 我正在开发一个rest API 它有以下请求 key value key1 value1 pl
  • 如何知道 glassfish 是什么 - 完整平台或网络配置文件?

    我已经安装了glassfish 我可以跑 asadmin version 它显示了它是什么版本 但如何知道它是 完整平台 还是 Web 配置文件 你可以使用 glassfish4 bin gt asadmin list containers
  • 属性文件中的字符串主机名:Java

    这听起来可能是一个非常简单的问题 但我无法找到解决方法 我有一个 config properties 文件 其中包含两个键值 IP 地址和端口号 我读取此配置文件以提取字符串格式的键值 但是 当我尝试使用这些值时 我无法连接到从配置文件中检
  • 读取不失真的灰度 PNG 图像文件

    我需要读取和处理大量的灰度 PNG 文件 我的意思是 如果它们在 Photoshop 或 GIMP 中打开 则图像模式为灰度 而不是具有灰度值的 RGB 图像 ImageIO 似乎没有实现这一点 它似乎将所有图像文件视为 sRGB 这会破坏
  • java.lang.ClassCastException: [B 无法转换为 java.lang.String

    我编写了一个带有字段 LoginId 和密码的实体类 我使用 AES ENCRYPT 加密密码并将其存储在数据库中 我只想检索已解密的密码 所以 我使用 AES DECRYPT 使用本机查询是在 OPen JPA 2 0 中 我写的查询是
  • Java 泛型:将 Object o 的类与 进行比较

    假设我有以下课程 public class Test
  • 如何在Java中通过反射调用代理(Spring AOP)上的方法?

    一个接口 public interface Manager Object read Long id 实现该接口的类 Transactional Public class ManagerImpl implements Manager Over
  • Visual Studio Code - Java 类路径不完整。只会报告语法错误

    在使用 python 获得了丰富的经验之后 我正在使用 java 迈出第一步 我正在运行的脚本是一个简单的 Java Swing Gui 它可以从命令行和 VS Code 中正常编译和运行 为了设置 java 调试环境 我使用 github
  • Wildfly 10.1 消耗所有核心

    我们最近将银行应用程序从 java 1 6 升级到 1 8 将 jboss 4 x 升级到 wildfly 10 1 我们观察到 java 消耗了机器上可用的所有核心 10 有人可以告诉是什么原因吗 通常情况下 jboss 4 x 的最大
  • 有没有办法处理Java堆空间异常[重复]

    这个问题在这里已经有答案了 我正在寻找将文件输入流转换为大文件 文件大小为 100MB 并且抛出 java lang OutOfMemoryError Java Heap space import java io FileInputStre
  • Java 中 .NET 的 Lambda 表达式

    我最近 再次 从 C 迁移到 Java 但我非常怀念 lambda 表达式和 C 的 IEnumerable Foreach 之类的东西 所以我正在寻找Java中的lambda表达式库 有比这更好的图书馆吗LambdaJ http code
  • 用 lambda 表达式替换匿名函数

    我在 Java 8 映射操作中传递一个函数 Intellij 告诉我它可以用 lambda 表达式替换 但我不知道如何在不创建中间对象结构的情况下做到这一点 这就是我所做的 List

随机推荐