在servlet中,我们通常会指定一个contentType,然后我们可以打印出html代码。
response.setContentType("text/html");
PrintWriter out = response.getWriter();如果我们没有指定一个contentType,那么任何contentType都会被设置为默认的呢?我做了一个测试,通过添加response.setContentType("text/html");,然后删除它,但我的网站能够呈现html?为什么会这样呢?
发布于 2016-05-03 09:01:38
你的问题有两个不同的部分。让我分别回答
Java容器中的默认Content-Type头值
如果我们没有指定一个
contentType,那么任何contentType都会被设置为默认的呢?
从ServletResponse#getContentType的Javadoc判断
返回用于此响应中发送的MIME主体的内容类型。在提交响应之前,必须使用
setContentType(java.lang.String)指定内容类型。如果未指定任何内容类型,此方法将返回null。
就ServletResponse而言,没有默认值。响应将根本不包含Content-Type头。
Java规范(版本2.4和版本3)明确规定Servlet容器不能定义默认的内容类型。
这是JavaServlet3.0规范- JSR-315的一段摘录,重点是我
Servlet程序员负责确保为servlet生成的内容在响应对象中适当设置
Content-Type头。HTTP1.1规范不要求在HTTP响应中设置此标头。servlet程序员没有设置Servlet容器时,不能设置默认的内容类型。
你是否能观察到这一点取决于外部因素。可以在servlet过滤器中填充Content-Type头,您的机器和执行该任务的服务器之间可能有一个代理,但是所有这些都是特定于给定应用程序的,或者是它部署的方式,而不是由Servlet容器决定的。
这在应用程序服务器之间可能有所不同,甚至依赖于一段配置(您可以使用web.xml指定扩展和内容类型之间的映射)。
底线是,有很多方法可以在Java应用程序中设置Content-Type头,但就Servlet而言,没有默认设置。
web浏览器处理缺少Content-Type头的响应
如果我们没有指定一个
contentType,那么任何contentType都会被设置为默认的呢?我做了一个测试,通过添加response.setContentType("text/html");,然后删除它,但我的网站能够呈现html?为什么会这样呢?
正如前面提到的,一些东西可能正在设置内容类型。有时候,尽管越来越少,即使不是这样,你的网页浏览器仍然可能通过对MIME类型进行有根据的猜测来处理响应。
火狐,用于实现一种名为“未知解码器”(最初放在类型上的文档)的机制,在最初发布这个答案时,它可能仍然可以在一些网络档案中找到。It 因为安全原因,现在不再这么做了。
不幸的是,我找不到一个明确的来源,描述铬/铬的行为。我希望他们的行为和Firefox一样,假设他们实现了这个标准,但我不能用引文来支持这一点。
https://stackoverflow.com/questions/36998638
复制相似问题