CORS - 如何"预检"httprequest?

Nic*_*ick 89 javascript wcf jquery cors

我正在尝试向WCF服务(我拥有)进行跨域HTTP请求.我已经阅读了几种处理跨域脚本限制的技术.因为我的服务必须同时兼顾GET和POST请求,所以我无法实现一些动态脚本标记,其src是GET请求的URL.由于我可以自由地在服务器上进行更改,因此我开始尝试实施一种解决方法,该方法涉及配置服务器响应,以包含"Access-Control-Allow-Origin"标头和带有OPTIONS请求的"预检"请求.我从这篇文章中得到了一个想法:让CORS正常工作

在服务器端,我的Web方法是在HTTP响应中添加"Access-Control-Allow-Origin:*".我现在可以看到响应包含此标题.我的问题是:我如何"预检"一个请求(OPTIONS)?我正在使用jQuery.getJSON来发出GET请求,但浏览器会立即取消臭名昭着的请求:

Access-Control-Allow-Origin不允许使用origin http:// localhost

有人熟悉这种CORS技术吗?需要在客户端进行哪些更改以预检我的请求?

谢谢!

mon*_*sur 153

在预检请求期间,您应该看到以下两个标题:Access-Control-Request-Method和Access-Control-Request-Headers.这些请求标头要求服务器发出实际请求的权限.您的预检响应需要确认这些标题才能使实际请求生效.

例如,假设浏览器使用以下标头发出请求:

Origin: http://yourdomain.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-Custom-Header
Run Code Online (Sandbox Code Playgroud)

然后,您的服务器应使用以下标头进行响应:

Access-Control-Allow-Origin: http://yourdomain.com
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: X-Custom-Header
Run Code Online (Sandbox Code Playgroud)

请特别注意Access-Control-Allow-Headers响应标头.此标头的值应与Access-Control-Request-Headers请求标头中的标头相同,并且不能为"*".

将此响应发送到预检请求后,浏览器将发出实际请求.您可以在此处了解有关CORS的更多信息:http://www.html5rocks.com/en/tutorials/cors/

  • @Kangkan您无需担心发送预检请求.如果请求需要预检,浏览器将为您发送. (14认同)
  • 感谢你对'特别关注'这个问题...解决了我对node/expressjs的问题我能够添加一个过滤器来捕捉这些预检请求`// cors和预检过滤app.all('*',function( req,res,next){.. // preflight需要返回确切的request-header res.set('Access-Control-Allow-Headers',req.headers ['access-control-request-headers']); if ('OPTIONS'== req.method)返回res.send(204); next();});` (4认同)
  • 我可能错过了什么.那么我应该发送两个XMLHttp请求吗?一个用于预检; 检查成功的响应然后发送实际的查询? (2认同)