Java - Servlet的默认contentType

had*_*des 1 java servlets

在servlet中,通常我们将指定contentType,然后我们可以打印出html代码.

response.setContentType("text/html");
PrintWriter out = response.getWriter();
Run Code Online (Sandbox Code Playgroud)

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

ton*_*edz 8

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

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

如果,我们没有指定a contentType,任何contentType将被设置为默认值?

从Javadoc判断 ServletResponse#getContentType

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

ServletResponse所涉及的情况而言,没有默认值.响应将不包含Content-Type标头.

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

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

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

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

这可以在应用程序服务器之间有所不同,甚至取决于一段配置(您可以使用mime-mappinginweb.xml指定扩展和内容类型之间的映射)

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

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

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

如前所述,某些东西可能正在设置内容类型.但即使不是这种情况,您的Web浏览器也可以在大多数时间处理它.

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

例如,Firefox 使用一种名为Unknown Decoder的东西

是Internet Explorer/Edge的功能

不幸的是,我找不到描述Chrome/Chromium行为的好消息来源.