关于CORS预检

  最近公司要求去掉所有请求的代理,于是发现了一个很奇妙的问题,请求一个服务时,使用$.GET()返回的是正确的,但是使用openlayers.request.GET则会返回500,

于是打开控制台看看两个请求之间的区别:

   心思缜密的我一下子就发现了问题:openlayers.request.GET发出的竟然是options请求,服务对options请求报错,于是便产生了这个问题;

  那么,为什么openlayers.request.GET发出的是options请求呢,那就的跟踪一下openlayers的源码啦,一顿视奸后,openlayers的请求实际是通过XMLHttpRequest对象来实现的,传参也是正确的,到底在哪出问题了呢???

  原来鸭,是由于openlayers在请求时默认带了一个请求头:Access-Control-Request-Headers:x-requested-with,根据CORS规定,这个请求不属于简单请求(simple request)于是便触发了一个"预检"请求,要求服务器确认可以这样请求,这时该服务对option类型的请求报错,就导致了本次问题的产生。

如何解决呢?

  最简单的,让请求作为简单请求发出,以此避免预检,而想要成为简单请求,就得割舍一些东西,“放下我执,方得自在”,同时满足下面的两个条件,才能称之为简单请求

(1) 请求方法是以下三种方法之一:

  • HEAD
  • GET
  • POST

(2)HTTP的头信息不超出以下几种字段:

  • Accept
  • Accept-Language
  • Content-Language
  • Last-Event-ID
  • Content-Type:只限于三个值application/x-www-form-urlencodedmultipart/form-datatext/plain

  

 

猜你喜欢

转载自www.cnblogs.com/ow-Y/p/10537689.html