由一个“两次请求”引出的Web服务器跨域请求访问问题的解决方案
2016-11-11 14:05
411 查看
我们公司的项目都是前后端分离的,上线几个月以来,发现一个很奇怪的问题,每次前端发起请求,通过浏览器的开发者工具都能看到在Network下同一个url有两条请求,第一条请求的Method为OPTIONS,第二条请求的Method才是真正的GET或者POST,并且,第一条请求无数据返回,第二条请求才会返回正常的数据。
发现这个问题之后,立即组织搜索问题产生的原因以及解决方案。在网上搜索了大量资料,得到的一个结论是:第一个OPTIONS的请求是由Web服务器处理跨域访问引发的。网上资料显示,OPTIONS是一种“预检请求”,浏览器在处理跨域访问的请求时如果判断请求为复杂请求,则会先向服务器发送一条预检请求,根据服务器返回的内容浏览器判断服务器是否允许该请求访问。如果web服务器采用cors的方式支持跨域访问,在处理复杂请求时这个预检请求是不可避免的。
查询代码发现,我们的web服务器确实采用的是cors来解决跨域访问的问题,并且我们在header中添加了自定义参数,导致我们的每次请求都为复杂请求,从而产生了每次请求都会发送两条请求的现象。
问题的原因找到了,就要想办法解决这个问题。既然浏览器在处理复杂请求时,不可避免的要发送预检请求,那么能否减少预检请求的次数呢?比如,预检一次设置一个有效期,在有效期内不再重复预检。顺着这个思路,继续搜索相关资料,最终发现设置Access-Control-Max-Age这个参数即可达到预期目标。该参数用来指定本次预检请求的有效期,单位为秒。在服务器上设置该参数之后,问题解决了,大快人心!!!
参考资料:http://blog.csdn.net/charleslei/article/details/51906635
发现这个问题之后,立即组织搜索问题产生的原因以及解决方案。在网上搜索了大量资料,得到的一个结论是:第一个OPTIONS的请求是由Web服务器处理跨域访问引发的。网上资料显示,OPTIONS是一种“预检请求”,浏览器在处理跨域访问的请求时如果判断请求为复杂请求,则会先向服务器发送一条预检请求,根据服务器返回的内容浏览器判断服务器是否允许该请求访问。如果web服务器采用cors的方式支持跨域访问,在处理复杂请求时这个预检请求是不可避免的。
查询代码发现,我们的web服务器确实采用的是cors来解决跨域访问的问题,并且我们在header中添加了自定义参数,导致我们的每次请求都为复杂请求,从而产生了每次请求都会发送两条请求的现象。
问题的原因找到了,就要想办法解决这个问题。既然浏览器在处理复杂请求时,不可避免的要发送预检请求,那么能否减少预检请求的次数呢?比如,预检一次设置一个有效期,在有效期内不再重复预检。顺着这个思路,继续搜索相关资料,最终发现设置Access-Control-Max-Age这个参数即可达到预期目标。该参数用来指定本次预检请求的有效期,单位为秒。在服务器上设置该参数之后,问题解决了,大快人心!!!
参考资料:http://blog.csdn.net/charleslei/article/details/51906635
相关文章推荐
- 由一个“两次请求”引出的Web服务器跨域请求访问问题的解决方案
- 记一次Spring MVC 一次请求,后台却访问两次的问题的解决方案
- 关于AXIS WebService通过HTTPS协议访问WAS Web服务错误问题的解决方案
- c#通过webrequest请求远程http服务时出现的问题
- 使用webView访问https的url-处理SslError解决android2.2版本之前的https请求问题
- 关于局域网电脑通过IP地址访问虚拟主机上的PHP WEB服务的问题
- chrome 浏览器的预提取资源机制导致的一个请求发送两次的问题以及ClientAbortException异常
- c#通过webrequest请求远程http服务时出现的问题
- Silverlight访问Window服务为宿主的WCF跨域问题解决方案.
- 用一个WEB服务或普通站点 实现这样一个效果?以URL请求,返回一个XML文档
- 遇到问题----win7安装apache服务出现 <OS 10013> 以一种访问权限不允许的方式做了一个访问套接字的尝试
- 尝试向 URI“ ”发出请求时出错。这可能是由于试图以跨域方式访问服务而又没有正确的跨域策略,或策略不适用于 SOAP 服务...。出现此错误也可能是由于使用的是 Web 服务代理中的内部类型而没有使用 InternalsVisibleToAttribute 属性。
- JAX-RS开发(三):ajax访问REST服务时的跨域问题以及jsonp解决方案
- axis2+Tomcat5.5+MyEclipse7.5部署和访问Web服务的安装问题
- 遇到问题----win7安装apache服务出现 <OS 10013> 以一种访问权限不允许的方式做了一个访问套接字的尝试
- 一个项目的web.config中身份认证,不同目录需要不同的身份认证问题的解决方案
- Windows 服务 与 Web服务中访问网络驱动器的问题(ERROR [HY024])
- 三层结构中解决同一解决方案不同项目中访问Web.config文件的问题
- 解决外部机器通过VM内ubuntu IP 无法访问vm内web服务的问题
- 【转】SQL2005无法启动SQL Server 请求失败或服务未及时响应等问题的解决方案