2018-04-13 HTTP开发跨域请求问题

跨域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.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容