您的问题有两个不同的部分。我来分别回答一下
Default Content-Type
Java 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-Type
Java Web 应用程序中的标头,但是就 Servlet API 而言,没有默认值.
处理缺失的响应Content-Type
Web 浏览器的标头
如果我们没有指定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 相同,假设它们实现了该标准,但我无法通过引用来支持这一点。