背景:项目中遇到了http返回状态码为 302 的情况,之前学习过基础知识知道是重定向,但是没有在实际项目中碰见,今天碰见了,那么就作为一个知识点记下来吧!
具体问题是:开发使用的架构http返回的是html文件而非json数据,请求之后页面会重新加载,但由于是重定向(而非 200 ),所以发送的请求不会进入到 success 的回调中,一直处于失败的回调。表面上虽然响应并跳转页面,但是实际上没有进入 ajax 成功的回调函数,可能造成页面间传参不正确,从而产生 bug。
寻找解决方案:https://www.jianshu.com/p/be0661078803,参考了这篇博文
302是一个普通的重定向代码。直观的看来是,请求者(浏览器或者模拟http请求)发起一个请求,然后服务端重定向到另一个地址。而事实上,服务端仅仅是增加一条属性到header,location=重定向地址。而一般的,浏览器会自动的再去请求这个 location,重新获取资源。也就是说,这个会使得浏览器发起两次请求。
作者:Crazy2015
链接:https://www.jianshu.com/p/be0661078803
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
证实:随后在开发工具中发现 http 的 response 内容,确实发现在 response 的 headers 中有 Location 的字段。
之后再跳转成功的页面下的初始化函数中写一个“回调函数”(本应该是这个请求发送成功的回调)。
总结:302 表示临时重定向,服务器端一般会返回头部有 location 字段的消息,方便客户端做进一步操作,一般情况下,浏览器会自动向 location 返回的 url 发送请求,从而用户好像没有感觉到有这个重定向的存在。
补充:302 在 POST 非幂等请求下的细分——303、307
在 GET、HEAD 这些幂等的请求方式上,302、303、307 没啥区别。
而对于 POST 就不同了,大部分浏览器对于 302 ,会将 POST 请求转为 GET,而 303 是规范强制规定将 POST 转为 GET 请求,请求地址为 header 头中的 Location,307 则不一样,规范要求浏览器继续向 Location 的地址 POST 内容。
303 和 307 是 HTTP1.1 新加的服务器响应文档的状态码,它们是对 HTTP1.0 中的 302 状态码的细化,主要用在对非 GET、HEAD 方法的响应上。文档规定:浏览器对 303 状态码的处理跟原来浏览器对 HTTP1.0 的 302 状态码的处理方法一样;浏览器对 307 状态码处理则跟原来 HTTP1.0 文档里对 302 的描述一样。
除非注明,否则均为泪雪博客原创文章,禁止任何形式转载
在我的理解,原来 HTTP1.0 规定对于 POST 返回 302,需要重新 POST 内容的,但是现实情况却很残酷,各大浏览器觉得这个规则很差劲,因为本来多次 POST 相同内容都是不怎么安全的,可能会产生重复的内容,所以各大浏览器纷纷不干,自立门户,采用 POST 内容后改用 GET 的方法保证安全性,后来 HTTP1.1 看这种趋势已不可挽回,就索性重新搞一个 303 来承认(标志)大多数浏览器的做法,说明各个浏览器都还是我的喽啰(,而 307 纯属为自己找台阶下)(——哈哈哈,纯属意淫帮助理解)。