跨域POST请求后端的数据时被服务器拒绝,后经试验,发现两种方法来解决此问题:
方法一:
服务器端设置:
Access-Control-Allow-Origin *;
Access-Control-Allow-Headers"Origin, X-Requested-With, Content-Type, Accept";
add_headerAccess-Control-Allow-Methods"GET, POST, OPTIONS";
jquery中的ajax中设置:
contentType: 'application/json',
这种方法能够跨域传值,但是由于客户端对于contentType中的 “预检请求(preflight request)”都会先访问服务器是否支持该跨域请求,得到允许后才会真正的请求第二次,拿到数据,所以这种方法会发送两次请求才能拿到数据,在控制台中可以看到。
方法二:
服务器端设置:
Access-Control-Allow-Origin *;
add_headerAccess-Control-Allow-Methods"GET, POST, OPTIONS";
jquery中的ajax中设置:
contentType: 'text/plain',
这种方法不属于contentType中的 “预检请求(preflight request)”所以只会发送一次
以上两种方法传入的对象都需经过JSON.stringify()方法来规范一下格式
预检请求(preflight request)
W3C标准:CROS,全称是跨域资源共享 (Cross-origin resource sharing),它的提出就是为了解决跨域请求的。
跨域资源共享(CORS)标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。
CORS规定,Content-Type属于以下MIME类型的,都不属于预检请求:
application/x-www-form-urlencoded
multipart/form-data
text/plain
所以 application/json的请求 会在正式通信之前,增加一次"预检"请求,这次"预检"请求会带上头部信息 Access-Control-Request-Headers: Content-Type:
OPTIONS /api/test HTTP/1.1
Origin: http://foo.example
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type.......
服务器回应时,返回的头部信息如果不包含Access-Control-Request-Headers: Content-Type则表示不接受非默认的的Content-Type。即出现以下错误:
Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.