这篇文章比较了IE7,firefox, chrome对http返回码303的处理。
http响应码
http响应码的分布从1xx ~ 5xx, 比较熟悉的有200(OK), 500 (Internal Server Error), 503 (Service Unavailable)等。
3xx系列的响应码表示“重定向” (Redirection), 这里特别分析303 (See Other),303的rfc2616说明有几点值得我们注意:
- 服务器在返回303的同时,应该(SHOULD)返回一个不同的URI,并放到Location字段中。
- 客户端收到303后,可以使用这个URI获取新的资源(必须使用GET获取新资源)
- 303的响应不能被缓存,但是Get到的新资源是可以被缓存的
如何模拟服务器发送303响应码
使用tomcat可以比较方便的模拟发送不同的响应码,主要代码如下
public class TestServlet extends HttpServlet {
@Override
public void doGet(final HttpServletRequest request, final HttpServletResponse response) {
response.setContentType("text/html;charset=UTF-8");
response.setHeader("Location", "/test/test2");
response.setStatus(303);
}
}
通过链接 http://localhost:8080/test/test1可以访问这个servlet。
各浏览器对303的处理方式:
共同点:三个浏览器在收到服务器303的响应后,都选择了立刻重定向到新的URI,在firefox使用firebug可以看处理的流程。
正常的事情人人都会做,下面主要搞点不正常的事情,看看三款浏览器的表现。
不正常事件一: 服务端返回303响应码,但是不返回Location(客户端没有URI可以重定向)
服务器端的代码如下,注释设置Location的语句即可
public class TestServlet extends HttpServlet {
@Override
public void doGet(final HttpServletRequest request, final HttpServletResponse response) {
response.setContentType("text/html;charset=UTF-8");
// response.setHeader("Location", "/test/test2");
response.setStatus(303);
}
}
IE7 显示的结果是常见的错误窗口,称之为IE的“通用错误窗口”,大家非常熟悉,部分截屏如下:
firefox和chrome则显示的http://localhost:8080/test/test1的内容。
换句话说,在没有给出Location的情况下,这两款浏览器返回的是原来页面返回的内容。
思考: 哪种返回更合理?
试想一种情况, 服务器端实现了一种机制, 对返回303的错误代码提供了一段"文本描述",同时“忘记”了设置了Location字段 (虽然根据http协议这是必须的)。 此时firefox和chrome即使不能进行本来应该进行的重定向,也可以显示服务器发回来的这段文本,具有提示作用(至少客户端知道自己网是通的吧),而IE的错误窗口就让人不知所云了。
不正常情况二: 循环重定向
这个时候又分两种情况
方法一,自己定向到自己,服务器端代码如下:
public class TestServlet extends HttpServlet {
@Override
public void doGet(final HttpServletRequest request, final HttpServletResponse response) {
response.setContentType("text/html;charset=UTF-8");
response.setHeader("Location", "/test/test1");
response.setStatus(303);
}
}
也就是说,使用链接http://localhost:8080/test/test1访问servlet,servlet返回一个URI,这个URI又指向http://localhost:8080/test/test1。
firefox和chrome都能检测到这个问题,firefox在重试了21次后检测到了这个问题,部分请求过程如下:
令人吃惊的结果又一次发生在IE上,IE居然进入了死循环,孜孜不倦的访问相同的链接,反映在浏览器上就是不断进行刷新。
思考: 有必要理会这种情况吗?
太有必要了,试想有人做了这样一个恶意网站,并诱导你去点击,如果不幸用的是IE, 由于不停刷新,你的浏览器可能崩溃。
方法二,定向到另外一个URI,从另外一个URI再定向回来
firefox和chrome也同样能够发现这种错误,IE7这次没犯上面的错误,但是错误窗口仍然是前面的“通用错误窗口”。
感慨: IE的developer太幸福了,处理错误只要祭出的大窗口就行了,爽啊。
总结:
firefox和chrome很好的完成了任务,特别要说的是chrome,非常好的一款软件,非常好。
而IE表现则让人很失望,从开始上网时就使用IE,这么多年了,还有这么多问题,说啥好呢。
- 大小: 12.6 KB
- 大小: 7.8 KB
- 大小: 28.8 KB
分享到:
相关推荐
http响应码 错误代码http响应码 错误代码http响应码 错误代码http响应码 错误代码
c#从ftp服务器上下载文件 丢给浏览器响应
描述pop3和smtp的通信命令及各种响应码含义以及MIME的数据格式。
如果手动在任务管理器关闭无响应窗口的话。会发现很多个360se进程。很容易错误关闭其他360浏览器窗口。后来发现。造成无响应的原因是dwn。exe使用冲突。只要直接找到类名为gohst的窗口。结束的就可以了.小工具是用vs...
Android之Http通信——2.详解Http的消息头与响应头中的demo,简单的例子
Httpwatch浏览器插件。请求和响应
快速响应码的识别和解码,通信专业的论文,在北航网站上下载
将本工程放在tomcat的webapps目录下,启动tomcat,作为web服务,在浏览器下播放http-flv协议的视频流
html5响应式图片布局自适应浏览器大小图片布局
这是一款能够在电脑显示出网页手机版本、ipad版本、PC版本的自适应浏览器,方便手机网站时候制作和调试。
Httpwatch浏览器插件。请求和响应
介绍浏览器性能优化的一些方法,包括页面加载,HTTP响应.
Httpwatch浏览器插件。请求和响应 Httpwatch浏览器插件。请求和响应
所有的来自微软互联网服务(WinInet)的 HTTP 请求在到达目标 Web 服务器之前都会经过 Fiddler,同样的,所有的 HTTP 响应都会在返回客户端浏览器之前经过 Fiddler。 当你启动了 Fiddler,程序将会把自己作为一个 ...
通过HttpClient.jar获取Http响应,获取响应码
Show类函数调用BrowserFrame函数,构建Frame,添加对象(菜单条,工具栏,主窗口),然后转到 主页,接收按钮、菜单的用户请求,分别调用不同的类(前进,后退,刷新,转动,收藏等)来响应动作 。
很多浏览器都在建立安全的形象,猎豹与其他传统安全浏览器不同,所做的并不仅仅是恶意网址拦截。 互联网上危机四伏,病毒木马横行,访问网页、下载文件、网络购物,都随时都可能中招,轻则造成电脑响应缓慢,重则...
当一个标签死锁的时候,他不会导致你整个浏览器没响应或者其他页面死锁。 2、在线书签:通过Avant的在线存储可以任何地方,办公司、家里、网吧访问你的书签,而且不需要担心重装系统时丢失数据。加密的独立书签文件...
查看浏览器的请求 和 服务器响应的 详细数据
超快速度启动的浏览器,网页秒开,超级安全,体积很小,欢迎广大用户来下载(本品属本人开发,侵权及非法利用必究)