你知道HTTP状态码204和304的区别么?

 

    在搜索引擎中输入“HTTP状态码”,或者输入“http status code”,能够找到详尽的资料。可是,这些资料大都是描述了状态码的定义,至于技术上的微妙之处,只能是靠本身摸索了吧。javascript

 

204和304的区别,直接告诉你们答案,仍是先卖个关子呢?知道答案的看到这里能够离开了,不知道答案的若是着急,能够直接跳到最后。若是还有些兴趣,那就跟我一步步来吧,这样记忆会更长久一些。html

 

204和304的定义,简单描述以下:java

204 No Content
304 Not Modified

 

顾名思义却是能看出一些端倪。可是,不管是英文仍是中文,204的补充说明颇有误导性:浏览器

If the client is a user agent, it SHOULD NOT change its document view.
在并无新文档的状况下,204 (SC_NO_CONTENT)确保浏览器继续显示先前的文档。

 

在真相大白以前,仍是先看看我遇到的问题吧。缓存

 

现象:服务器

   网页使用了jQuery。本机IE10打开页面没有问题。两位同事的IE10打开页面报$函数不存在错误。 ide

分析:函数

两位同事的IE10对两个页面中相同来源的javascript文件,只执行一遍。打开第一个页面可以正常显示,打开第二个页面则报$函数不存在错误。搜索引擎

错误的解决方式:spa

恢复IE默认配置,以下图所示:

正确的解决方式:

注意到这个站点在输出内容以前有这么一个逻辑

if(resultText.equals("")){
httpServletResponse.setStatus(204);
}

正确的作法是把整个if语句所有注掉。浏览器的配置是“自动”仍是“每次访问网页时”,都行。错误现象中“本机IE10打开页面没有问题”是个误导,只要操做“得当”,问题在本机也是能够再现的。

 

真相,204和304的区别:

 在本例中,204的同时返回了空文件,这个空文件要替换上次缓存的文件。这样第一次打开页面获取jQuery代码是正确的,页面正常显示;第二次打开页面时询问是否要更新,结果返回了空文件,这个空文件成为了新的缓存,而后错误现象看起来就像是jQuery没有加载,并且之后也不会再“加载”了,由于文件是空的拿什么加载?注释掉那个httpServletResponse.setStatus(204)的程序指令,Web服务器就自动返回304了,304的意思是还用上次的缓存,这样就不会有空文件的问题,因此页面正常显示。这就解释了为何当出现问题时清空缓存有用,也不难理解为何“每次从服务器刷新”更有用。由于浏览器安装的默认配置就是有缓存机制的,咱们要求每一个用户去修改他们的配置不现实,因此假若不可以正确地理解到204和304的微妙区别,便不能铲除错误的根源,留下一个阴影在那里微笑。

相关文章
相关标签/搜索