Java - Servlet的默认contentType

时间:2016-05-03 07:56:18

标签: java servlets

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

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

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

1 个答案:

答案 0 :(得分:8)

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

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

  

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

根据Javadoc判断ServletResponse#getContentType

  

返回用于此响应中发送的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相关的而言,没有默认

处理网络浏览器缺少Content-Type标题的回复

  

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

如前所述,某些内容可能正在设置内容类型。但即使情况并非如此,您的网络浏览器也可以在大多数时间处理它。

当浏览器遇到缺少内容类型标题的响应时,他们只是尝试进行有根据的猜测。

Firefox,例如,uses a thing called the Unknown Decoder

此处what Internet Explorer/Edge does

不幸的是,我无法找到描述Chrome / Chromium行为的良好来源。