Simple requests
A simple cross-site request is one that meets all the following conditions:
The only allowed methods are:
GET
HEAD
POST
Apart from the headers set automatically by the user agent (e.g. Connection, User-Agent, etc.), the only headers which are allowed to be manually set are:
Accept
Accept-Language
Content-Language
Content-Type
The only allowed values for the Content-Type header are:
application/x-www-form-urlencoded
multipart/form-data
text/plain
Simple requests
A simple cross-site request is one that meets all the following conditions:
The only allowed methods are:
GET
HEAD
POST
Apart from the headers set automatically by the user agent (e.g. Connection, User-Agent, etc.), the only headers which are allowed to be manually set are:
Accept
Accept-Language
Content-Language
Content-Type
The only allowed values for the Content-Type header are:
application/x-www-form-urlencoded
multipart/form-data
text/plain
我也遇到这个问题。
前台跨域post请求,由于CORS(cross origin resource share)规范的存在,浏览器会首先发送一次options嗅探,同时header带上origin,判断是否有跨域请求权限,服务器响应access control allow origin的值,供浏览器与origin匹配,如果匹配则正式发送post请求。
如果有服务器程序权限,设置,比如jsp中,设置header access control allow origin等于*,就可以得到跨域访问的目的。
ajax你就别想跨域了.
目前jsonp是最佳跨域方案,不过只能传4kByte以下的数据.
想跨域post的话可以利用form+iframe,如果只需要post而不管数据处理后返回的结果是很简单的,如果还需要知道数据处理后返回的结果就麻烦点了.反正办法是有,就是有点麻烦.
你的后端程序处理后,可以跳转到一个url页面,处理结果用参数加到url里.
这个url页面和当前数据处理页面同域.这个url页面就做一个处理:把处理结果的参数解析出来,然后调用父页面的一个js方法,把结果传过去.
因为form的target设置为iframe,跳转的这个url页面就相当于在这个iframe里运行.这样就可以达到把处理结果回调到当前数据处理页面了.
引用来自“851228082”的评论
我也遇到这个问题。
前台跨域post请求,由于CORS(cross origin resource share)规范的存在,浏览器会首先发送一次options嗅探,同时header带上origin,判断是否有跨域请求权限,服务器响应access control allow origin的值,供浏览器与origin匹配,如果匹配则正式发送post请求。
如果有服务器程序权限,设置,比如jsp中,设置header access control allow origin等于*,就可以得到跨域访问的目的。
跨域请求时,浏览器会判断是“简单请求”还是“复杂请求”,
简单请求就是符合一下条件的。
除了简单请求就是复杂请求。
简单请求,处理过程比较简单,浏览器会发送请求到后台,如果响应头的Access-Control-Allow-Origin匹配origin,那么浏览器会将结果传给xmlhttprequest。
复杂请求,浏览器会首先发送一次options请求,这是一次嗅探,后台需要有响应的options方法处理,如果options方法返回的Access-Control-Allow-Origin符合origin,那么浏览器会发送正式的post。综上所述,简单请求只发送一次请求,复杂请求会发送两次options+(get/post/head)
跨资源访问官方解答:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
引用来自“851228082”的评论
我也遇到这个问题。
前台跨域post请求,由于CORS(cross origin resource share)规范的存在,浏览器会首先发送一次options嗅探,同时header带上origin,判断是否有跨域请求权限,服务器响应access control allow origin的值,供浏览器与origin匹配,如果匹配则正式发送post请求。
如果有服务器程序权限,设置,比如jsp中,设置header access control allow origin等于*,就可以得到跨域访问的目的。
引用来自“851228082”的评论
再修正一下这个答案。跨域请求时,浏览器会判断是“简单请求”还是“复杂请求”,
简单请求就是符合一下条件的。
除了简单请求就是复杂请求。
简单请求,处理过程比较简单,浏览器会发送请求到后台,如果响应头的Access-Control-Allow-Origin匹配origin,那么浏览器会将结果传给xmlhttprequest。
复杂请求,浏览器会首先发送一次options请求,这是一次嗅探,后台需要有响应的options方法处理,如果options方法返回的Access-Control-Allow-Origin符合origin,那么浏览器会发送正式的post。综上所述,简单请求只发送一次请求,复杂请求会发送两次options+(get/post/head)
跨资源访问官方解答:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
关于这个问题,我写了一篇博客,请查看 http://blog.csdn.net/wangjun5159/article/details/49096445
首先基于 ajax 的跨域请求无论是 get, post 都需要服务器端进行配套的代码支持.
浏览器在进行跨域 ajax 的时候先进行协商, 也就是所谓的 OPTIONS, 这个协商是和服务器端的配套代码进行通讯,
这个协商不许需要客户端写代码参与, 因为这是 http 跨域请求的协议.
所以你的问题主要是服务器端如何设置, 这里给你一个 go 语言的例子
https://github.com/martini-contrib/cors/blob/master/cors.go#L27
其实就是一些参数, 但是肯定需要代码配合.
客户端 ajax 就简单的, 你可以直接在 OSC 的页面上打开控制台, 用下面 ES6 fetch 的写法试一下
fetch('https://api.github.com/repos/powjs/powcss/releases/latest')
监控下控制台 network 的信息, 就知道服务器上的哪些字段就是用来协商的 Head.