栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

boost::asio创建的HTTP服务支持跨域CORS

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

boost::asio创建的HTTP服务支持跨域CORS

浏览器中js的请求访问非同一个域名下的服务,就会产生跨域问题,浏览器会自动发送一个OPTIONS请求进行验证,服务端会做出响应,当浏览器判断服务的响应头中包含允许跨域的字段后,才会允许HTML中js进行请求。
跨域的错误提示如下:

Access to XMLHttpRequest at 'http://127.0.0.1:8092/' from origin 'http://192.168.10.135:38312' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

因此asio服务必须要对接收的options请求返回允许跨域的响应头,一般添加如下三个就可以。

Access-Control-Allow-Origin:*
Access-Control-Allow-Methods:*
Access-Control-Allow-Headers:*

在C++的代码中这样增加:

rep.status = reply::ok;
            //响应头必须带上响应数据长度以及类型
            //如果不带上响应类型 fiddler可以得到值 但通过python或者C++拿不到值
            rep.headers.resize(5);

            rep.headers[0].name = "Content-Type";
            rep.headers[0].value = "application/json;charset=UTF-8";

            rep.headers[1].name = "Content-Length";
            //http请求返回的必须是utf8格式的字符串
            //utf8格式一个中文占3个字节

            //最外层json结束
            writer.EndObject();
            string ret_data = strBuf.GetString();

            rep.content =ret_data;
            rep.headers[1].value = std::to_string(rep.content.size());


            rep.headers[2].name = "Access-Control-Allow-Origin";
            rep.headers[2].value = "*";

            rep.headers[3].name = "Access-Control-Methods";
            rep.headers[3].value = "*";

            rep.headers[4].name = "Access-Control-Allow-Headers";
            rep.headers[4].value = "*";

启动服务后,可以看到浏览器没有报跨域的错误提示。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935912.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号