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 的相关文章

  • Maven 2:如何将当前项目版本打包在WAR文件中?

    我正在使用 Maven 2 构建我的 Java 项目 并且正在寻找一种向用户呈现 pom xml 当前版本号的方法 例如使用 Servlet 或 JSP 据我所知 最好的方法是 Maven 将版本号作为文本文件打包到 WAR 中 这使我能够
  • Hashmap并发问题

    我有一个哈希图 出于速度原因 我希望不需要锁定 假设我不介意过时的数据 同时更新它和访问它会导致任何问题吗 我的访问是获取 而不是迭代 删除是更新的一部分 是的 这会导致重大问题 一个例子是向散列映射添加值时可能发生的情况 这可能会导致表重
  • 在Java中使用命令行编译多个包

    您好 我一直在使用 IDE 但现在我需要从命令行运行和编译 问题是我有多个软件包 我试图找到答案 但没有任何效果 所以我有 src Support java files Me java files Wrapers java files 你知
  • 无法在类对象的 ArrayList 中存储值。 (代码已编辑)

    这基本上是一个 Java 代码转换器 它涉及一个 GUI 让用户输入类类型 名称和方法 为了存储值 我创建了一个类VirtualClass与ArrayList
  • MongoTemplate upsert - 从 pojo 进行更新的简单方法(哪个用户已编辑)?

    这是一个简单的 pojo public class Description private String code private String name private String norwegian private String en
  • URL.setURLStreamHandlerFactory

    我正在使用带有嵌入式 Jetty 的可执行 jar 开发一个 Web 应用程序 我的jar包含一个依赖jar jar in jar 我参考了JarRsrcLoader and RsrcURLStreamHandlerFactory由 Ecl
  • Java Microsoft Excel API [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • JTable 和 JScrollpane 大小的问题

    我有一个JScrollPane with a JTable在里面 在里面JTable我最初有 3 行 稍后添加行 默认JTable我的 3 行很难看 因为JScrollPane calls getPreferredScrollableVie
  • 线程“main”中的异常 java.lang.StackOverflowError

    我有一段代码 但我无法弄清楚为什么它在线程 main java lang StackOverflowError 中给出异常 这是问题 Given a positive integer n prints out the sum of the
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • Jenkins 的代码覆盖率 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • JSch中如何设置文件类型和文件传输模式?

    我使用 Apache Common NetFTPClient并设置了我的ftpClient在上传文件之前使用如下所示的方法 ftpClient setFileType FTP BINARY FILE TYPE ftpClient setFi
  • 改变for循环的顺序?

    我遇到一种情况 我需要根据用户输入以不同的顺序循环遍历 xyz 坐标 所以我是 3D 空间中的一个区域 然后是一组像这样的 for 循环 for int x 0 x lt build getWidth x for int y 0 y lt
  • 了解 Spark 中的 DAG

    问题是我有以下 DAG 我认为当需要洗牌时 火花将工作划分为不同的阶段 考虑阶段 0 和阶段 1 有些操作不需要洗牌 那么为什么 Spark 将它们分成不同的阶段呢 我认为跨分区的实际数据移动应该发生在第 2 阶段 因为这里我们需要cogr
  • 为什么我的代码会产生错误:该语句没有返回结果集[重复]

    这个问题在这里已经有答案了 我正在从 Microsoft SQL Server Studio 执行以下查询 该查询工作正常并显示结果 SELECT INTO temp table FROM md criteria join WHERE us
  • 警告:无法更改每个人的权限:

    当运行 Java 快速入门示例时https developers google com drive web quickstart java hl hu https developers google com drive web quicks
  • 为什么这个私人浮动字段变为零?

    我有一些奇怪的行为 我很难向自己解释 称为 textureScale 的浮点字段变为零 如果某些代码正在更改该值 则可以解释这一点 然而 我希望能够通过将其设置为 私有最终浮点 来导致构建失败 或者至少是运行时异常 那么无论更改该值都将失败
  • 对于当前月份和日期但年份不同的日期,经过的月份计算未给出正确的结果

    我正在尝试计算自特定日期以来经过的月份 该函数工作正常 尽管如果我将今天的日期与过去的不同年份放在一起 它会给我一个月的差异 不到一个月 假设对于所有日期 该函数都运行良好 除了 如果今天是 2014 03 06 YYYY MM DD 并且
  • 防止Java实例化的正确方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在不同版本的Google App Engine中使用自定义域名?

    我使用谷歌应用程序引擎作为我的 Android 和 Web 应用程序的服务器 我使用 Android Studio 开发了 Android 应用程序 并使用 Eclipse 开发了 Web 应用程序 我在应用程序引擎中部署了两个版本 第一个

随机推荐