$.ajax post方式变成OPTIONS 跨域请求

daoinfo 发布于 2013/06/17 19:37
阅读 58K+
收藏 1

NGINX Sprint China 2022--NGINX年度旗舰盛会,已开启免费预约!>>>

$.ajax post方式变成OPTIONS 跨域请求,怎么把让它还是post请求
加载中
0
喻恒春
喻恒春

首先基于 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.

 

 

 

0
NTC
NTC
该评论暂时无法显示,详情咨询 QQ 群:点此入群
0
851228082
851228082

引用来自“851228082”的评论

我也遇到这个问题。

前台跨域post请求,由于CORS(cross origin resource share)规范的存在,浏览器会首先发送一次options嗅探,同时header带上origin,判断是否有跨域请求权限,服务器响应access control allow origin的值,供浏览器与origin匹配,如果匹配则正式发送post请求。

如果有服务器程序权限,设置,比如jsp中,设置header access control allow origin等于*,就可以得到跨域访问的目的。

引用来自“851228082”的评论

再修正一下这个答案。
跨域请求时,浏览器会判断是“简单请求”还是“复杂请求”,
简单请求就是符合一下条件的。
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




除了简单请求就是复杂请求。

简单请求,处理过程比较简单,浏览器会发送请求到后台,如果响应头的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

w
w934576256
回复 @Sc时辰 : 咋解决的。大虾求指教。我也碰到这问题,一直没解决
Sc时辰
Sc时辰
太棒了,完美解决了我的疑问,不过有没有办法把复杂请求改为简单请求呢?
0
851228082
851228082

引用来自“851228082”的评论

我也遇到这个问题。

前台跨域post请求,由于CORS(cross origin resource share)规范的存在,浏览器会首先发送一次options嗅探,同时header带上origin,判断是否有跨域请求权限,服务器响应access control allow origin的值,供浏览器与origin匹配,如果匹配则正式发送post请求。

如果有服务器程序权限,设置,比如jsp中,设置header access control allow origin等于*,就可以得到跨域访问的目的。

再修正一下这个答案。
跨域请求时,浏览器会判断是“简单请求”还是“复杂请求”,
简单请求就是符合一下条件的。
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




除了简单请求就是复杂请求。

简单请求,处理过程比较简单,浏览器会发送请求到后台,如果响应头的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

1
851228082
851228082

我也遇到这个问题。

前台跨域post请求,由于CORS(cross origin resource share)规范的存在,浏览器会首先发送一次options嗅探,同时header带上origin,判断是否有跨域请求权限,服务器响应access control allow origin的值,供浏览器与origin匹配,如果匹配则正式发送post请求。

如果有服务器程序权限,设置,比如jsp中,设置header access control allow origin等于*,就可以得到跨域访问的目的。

hotalice
hotalice
xiexie
0
IluckySi
IluckySi
亲,你的问题解决了吗?我也遇到了类似的问题,我前端服务器用的nginx,后面用的tomcat,界面本来是post提交登录,可是到tomcat上看post变成了options,怎么回事啊》?????
0
sjunjun
sjunjun

你的后端程序处理后,可以跳转到一个url页面,处理结果用参数加到url里.

这个url页面和当前数据处理页面同域.这个url页面就做一个处理:把处理结果的参数解析出来,然后调用父页面的一个js方法,把结果传过去.

因为form的target设置为iframe,跳转的这个url页面就相当于在这个iframe里运行.这样就可以达到把处理结果回调到当前数据处理页面了.

0
月影又无痕
月影又无痕
url写错了,仔细检查url中是否包含了无效空格等字符
0
sjunjun
sjunjun

ajax你就别想跨域了.

目前jsonp是最佳跨域方案,不过只能传4kByte以下的数据.

想跨域post的话可以利用form+iframe,如果只需要post而不管数据处理后返回的结果是很简单的,如果还需要知道数据处理后返回的结果就麻烦点了.反正办法是有,就是有点麻烦.

leo108
leo108
回复 @宋均均 : 哦哦,我以为你说的是返回的数据长度,理解有偏差
sjunjun
sjunjun
回复 @leo108 : jsonp通过一个js的src来请求数据.这个src的长度限制决定了数据的限制.
leo108
leo108
回复 @宋均均 : jsonp和url长度有关系?
sjunjun
sjunjun
回复 @leo108 : ie限制了url的长度为4k
panmingguang
panmingguang
form+ iframe 也不行的啊, 数据可以返回, 但是不能处理返回的数据, 一般我们返回的都是JSON的数据格式, 不能处理 也没有用, 用httpclient 获取后数据返回 这种方式 应该是可以的
下一页
0
William
William
跨域应该不能POST
851228082
851228082
跨域可以get、post、head
d
daoinfo
关键是2个tomat在一个服务器上,用的是mod_proxy负载均衡,不知道这是什么原因
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部