Java - Servlet 的默认 contentType

2024-05-05

在servlet中,通常我们会指定一个contentType,然后我们就可以打印出html代码了。

response.setContentType("text/html");
PrintWriter out = response.getWriter();

如果我们不指定 contentType,任何 contentType 都会被设置为默认值怎么办?我做了一个测试,添加了response.setContentType("text/html");,然后删除它,但我的网站能够呈现html?这是为什么?


您的问题有两个不同的部分。我来分别回答一下

Default Content-TypeJava Servlet 容器中的标头值

如果我们没有指定contentType, any contentType会被设置为默认值吗?

根据 Javadoc 判断ServletResponse#getContentType https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletResponse.html#getContentType()

返回用于此响应中发送的 MIME 正文的内容类型。正确的内容类型必须已使用指定setContentType(java.lang.String)在提交响应之前。如果未指定内容类型,则此方法返回null.

没有默认值ServletResponse被关注到。响应将根本不包含Content-Type header.

Java Servlet 规范(版本 2.4 和版本 3)明确指出 Servlet 容器must not定义默认内容类型。

这是摘录自Java Servlet 3.0 规范 - JSR-315 http://download.oracle.com/otndocs/jcp/servlet-3.0-fr-oth-JSpec/,强调我的

Servlet 程序员有责任确保Content-Type标头是 在响应对象中为 servlet 生成的内容进行适当设置。这 HTTP 1.1 规范不要求在 HTTP 响应中设置此标头。当 Servlet 程序员设置默认内容类型时,Servlet 容器不得设置默认内容类型 不设置类型。

你能否观察到这一点取决于外部因素。可以有 servlet 过滤器来填充Content-Type标头,您的计算机和执行此操作的服务器之间可能存在代理,但所有这些都是特定于给定应用程序或其部署方式的,而不是由 Servlet 容器确定的。

这在不同的应用程序服务器之间可能有所不同,甚至取决于一项配置(您可以使用指定扩展和内容类型之间的映射)mime-mapping in web.xml http://wiki.metawerx.net/wiki/Web.xml)

最重要的是,有很多方法可以设置Content-TypeJava Web 应用程序中的标头,但是就 Servlet API 而言,没有默认值.

处理缺失的响应Content-TypeWeb 浏览器的标头

如果我们没有指定contentType, any contentType会被设置为默认值吗?我做了一个测试,添加了response.setContentType("text/html");,然后删除它,但我的网站能够呈现html?这是为什么?

正如前面提到的,某些东西可能会一路设置内容类型。有时,尽管情况越来越少,但即使情况并非如此,您的 Web 浏览器仍可能通过对 MIME 类型进行有根据的猜测来处理响应。

Here's Internet Explorer/Edge 的用途 https://msdn.microsoft.com/en-us/library/ms775147(v=vs.85).aspx

Firefox,用于实现一种称为未知解码器(文档最初放置在https://developer.mozilla.org/en-US/docs/Mozilla/How_Mozilla_determines_MIME_Types https://developer.mozilla.org/en-US/docs/Mozilla/How_Mozilla_determines_MIME_Types,可能仍然在某些网络档案中可用)早在这个答案最初发布时。它出于安全原因不再这样做 https://developer.mozilla.org/en-US/docs/Learn/Server-side/Configuring_server_MIME_types#why_are_correct_mime_types_important.

不幸的是,我找不到描述 Chrome/Chromium 行为的明确来源。我希望它们的行为方式与 Firefox 相同,假设它们实现了该标准,但我无法通过引用来支持这一点。

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

Java - Servlet 的默认 contentType 的相关文章

  • Java - 为什么不允许 Enum 作为注释成员?

    It says 原始 String Class an Enum 另一个注释 上述任何一个的数组 只有这些类型才是合法的 Annotation 成员 为什么泛型 Enum 不能成为 Annotation 的成员 例如 Retention Re
  • 在文本文件中写入多行(java)

    下面的代码是运行命令cmd并使用命令行的输出生成一个文本文件 下面的代码在 Eclipse 的输出窗口中显示了正确的信息 但在文本文件中只打印了最后一行 谁能帮我这个 import java io public class TextFile
  • 使用 JPA Criteria API 进行分页的总行数

    我正在系统中为实体实现 高级搜索 功能 以便用户可以使用该实体的属性上的多个条件 eq ne gt lt 等 来搜索该实体 我正在使用 JPA 的 Criteria API 动态生成 Criteria 查询 然后使用setFirstResu
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • 正则表达式拆分数字和字母组,不带空格

    如果我有一个像 11E12C108N 这样的字符串 它是字母组和数字组的串联 如何在中间没有分隔符空格字符的情况下分割它们 例如 我希望分割结果为 tokens 0 11 tokens 1 E tokens 2 12 tokens 3 C
  • OSGi:如果不取消服务会发生什么

    这是我获取 OSGi 服务的方式 ServiceReference reference bundleContext getServiceReference Foo class getName Foo foo Foo bundleContex
  • 比较两个文本文件的最快方法是什么,不将移动的行视为不同

    我有两个文件非常大 每个文件有 50000 行 我需要比较这两个文件并识别更改 然而 问题是如果一条线出现在不同的位置 它不应该显示为不同的 例如 考虑这个文件A txt xxxxx yyyyy zzzzz 文件B txt zzzzz xx
  • wait() 在游戏中如何工作?

    在 playframework 的文档中here http www playframework org documentation 1 2 1 asynchronous已写 public static void loopWithoutBlo
  • Cassandra java驱动程序协议版本和连接限制不匹配

    我使用的java驱动程序版本 2 1 4卡桑德拉版本 dsc cassandra 2 1 10cql 的输出给出以下内容 cqlsh 5 0 1 Cassandra 2 1 10 CQL spec 3 2 1 Native protocol
  • 当从服务类中调用时,Spring @Transactional 不适用于带注释的方法

    在下面的代码中 当方法内部 是从内部调用的方法外部 应该在交易范围内 但事实并非如此 但当方法内部 直接从调用我的控制器class 它受到事务的约束 有什么解释吗 这是控制器类 Controller public class MyContr
  • 使用 AES SecretKey 的 Java KeyStore setEntry()

    我目前正在 Java 中开发一个密钥处理类 特别是使用 KeyStore 我正在尝试使用 AES 实例生成 SecretKey 然后使用 setEntry 方法将其放入 KeyStore 中 我已经包含了代码的相关部分 The KS Obj
  • hibernate锁等待超时超时;

    我正在使用 Hibernate 尝试模拟对数据库中同一行的 2 个并发更新 编辑 我将 em1 getTransaction commit 移至 em1 flush 之后我没有收到任何 StaleObjectException 两个事务已成
  • 具有 java XSLT 扩展的数组

    我正在尝试使用 java 在 XSLT 扩展中使用数组 我收到以下错误 Caused by java lang ClassCastException org apache xpath objects XObject cannot be ca
  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s
  • Java整数双除法混淆[重复]

    这个问题在这里已经有答案了 方案1 int sum 30 double avg sum 4 result is 7 0 not 7 5 VS 方案2 int sum 30 double avg sum 4 0 Prints lns 7 5
  • 在 Spring 中重构这个的最佳方法?

    private final ExecutorService executorParsers Executors newFixedThreadPool 10 public void parse List
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • 带有 Maven Wrapper 的 Java 17 导致无法识别的 VM 选项“MaxPermSize=512m”

    I use OpenJDK 17 https jdk java net 17 使用 Maven Wrapper 3 8 2 从春季初始化 https start spring io Maven项目 JAR打包 Java 17 Spring
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import

随机推荐