【问题标题】:Java - Default contentType for ServletJava - Servlet 的默认 contentType
【发布时间】:2016-08-28 04:11:02
【问题描述】:

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

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

如果,我们没有指定 contentType,那么任何 contentType 都会被设置为默认值?我通过添加response.setContentType("text/html"); 进行了测试,然后在它之后删除,但是我的网站能够呈现 html?这是为什么?

【问题讨论】:

  • HTTP 功能是在打印(例如)HTM 文本之前发送所谓的标题行,然后是一个空行,然后是(HTML)内容。一个标题行可以是“Content-Type: text/html”。如果没有发送,浏览器必须自己猜测。
  • 如果您谈论的是浏览器解释响应,那么他们默认将其视为text/html 听起来很自然,这是他们大部分时间应该得到的。
  • @Berger 不是默认是 text/plain 吗?我在某处读过它
  • @hades 默认为 contentType="text/html"。你可以从这里阅读docs.oracle.com/cd/B14099_19/web.1012/b14014/jspnls.htm
  • @JarYit 用于 JSP,而不是 Servlet API

标签: java servlets


【解决方案1】:

您的问题有两个不同的部分。让我分别回答他们

Java Servlet 容器中的默认 Content-Type 标头值

如果我们没有指定contentType,那么任何contentType 都会被设置为默认值?

根据 ServletResponse#getContentType 的 Javadoc 判断

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

ServletResponse 而言,没有默认值。响应将根本不包含 Content-Type 标头。

Java Servlet 规范(2.4 版和 3 版)明确规定 Servlet 容器不得定义默认内容类型。

这是Java Servlet 3.0 Specification - JSR-315的摘录,重点是我的

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

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

这可能因应用服务器而异,甚至取决于某个配置(您可以使用 mime-mapping in web.xml 指定扩展和内容类型之间的映射)

最重要的是,您可以通过多种方式在 Java Web 应用程序中设置 Content-Type 标头,但就 Servlet API 而言,没有默认设置。 p>

Web 浏览器处理缺少 Content-Type 标头的响应

如果我们没有指定contentType,那么任何contentType 都会被设置为默认值?我通过添加response.setContentType("text/html"); 进行了测试,然后在它之后删除,但是我的网站能够呈现 html?这是为什么呢?

如前所述,可能会在此过程中设置内容类型。有时,尽管越来越少,即使情况并非如此,您的网络浏览器仍可能通过对 MIME 类型做出有根据的猜测来处理响应。

这里是what Internet Explorer/Edge does

Firefox,用于实现一种称为 Unknown Decoder 的机制(最初放置在 https://developer.mozilla.org/en-US/docs/Mozilla/How_Mozilla_determines_MIME_Types 的文档,可能仍可在某些网络档案中找到)回到最初发布此答案时。它no longer does that for security reasons

很遗憾,我找不到描述 Chrome/Chromium 行为的明确来源。我希望它们的行为方式与 Firefox 相同,假设它们实现了标准,但我不能用引用来支持它。

【讨论】:

  • 解释清楚详细,非常感谢......谢谢:D
猜你喜欢
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多