MALOUDA-PSA 2024-02-27 22:16 采纳率: 91%
浏览 3
已结题

关于客户端申请跨域的问题2

还是报错,怀疑是c++代码的问题:
Access to XMLHttpRequest at 'http://192.168.2.22:88/' from origin 'http://127.0.0.1:8080' has been blocked by CORS policy: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.

c++做了跨域:

void HttpResponse::addHeader(Buffer& buffer)
{
    buffer.append("Content-Type: text/html; charset=UTF-8\r\n");
    buffer.append("Connection: ");
    if(isKeepAlive)
    {
        buffer.append("keep-alive\r\n");
    }
    else
    {
        buffer.append("close\r\n");
    }

        buffer.append("Content-type: application/json\r\n");
    buffer.append("Access-Control-Allow-Origin:*\r\n");

前端js:

result.addEventListener("mouseover", function(){
        const xhr = new XMLHttpRequest();
        //      console.log("test");
        //xhr.open('GET', 'http://121.41.165.74:8888/getjson');
        xhr.open('POST', 'http://121.41.165.74:8888');
        //  xhr.send('json_data=');
        // json object1 = R"({"ProjName":"*********************hn","FileName":"eeee    .catpart", "ProjNumber":30, "JpgFile":"kk.jpg","Comments": "cdr for employee    ","ProjType": "graphic design","ProjState": 1,  "version": 1,"CreateTime": "    20230728","UpdateTime": "20230608","pid": 6})"
        var jsonObject = {
        "ProjName": "*********************hn",
        "FileName": "eeee.catpart",
        "ProjNumber": 30,
        "JpgFile": "kk.jpg",
        "Comments": "cdr for employee",
        "ProjType": "graphic design",
        "ProjState": 1,
        "version": 1,
        "CreateTime": "20230728",
        "UpdateTime": "20230608",
        "pid": 6
        };
        // 将 JSON 对象转换为字符串
        var jsonString = JSON.stringify(jsonObject);
        // 创建 XMLHttpRequest 对象
        //var xhr = new XMLHttpRequest();
        //var url = "your_backend_url_here"; // 替换成你的后端接口地址
        // 设置 POST 请求
    //  xhr.open("POST", url, true);
        xhr.setRequestHeader("Content-Type", "application/json");
        // 发送请求
        xhr.send(jsonString);
        xhr.onreadystatechange=function(){
            if(xhr.readyState === 4){
                if(xhr.status >= 200 && xhr.status <300){
                    result.innerHTML = xhr.response;
                }   }}
});



  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-27 22:17
    关注

    引自免费微信小程序:皆我百晓生

    你遇到的问题是跨域资源共享(CORS)错误,具体表现是浏览器阻止了你的前端JavaScript通过XMLHttpRequest发起的POST请求,因为目标服务器没有在预检请求(OPTIONS)响应中允许Content-Type头部。

    问题分析:

    1. 从错误信息可以看出,尽管你在后端C++代码中设置了Access-Control-Allow-Origin: *以允许任何源进行跨域访问,但并未处理预检请求中的Access-Control-Allow-Headers头,导致POST请求时发送的Content-Type: application/json被服务器拒绝。

    2. 在前端JavaScript中,你正确地设置了xhr.setRequestHeader("Content-Type", "application/json")来表明要发送JSON数据,但在后端C++代码中未处理这个请求头。

    解决方案:

    你需要修改后端C++代码,以便在响应中添加Access-Control-Allow-Headers头,并指定允许Content-Type。以下是修改后的C++代码:

    void HttpResponse::addHeader(Buffer& buffer, bool isPostRequest)
    {
        // 其他原有设置保持不变
    
        buffer.append("Access-Control-Allow-Origin: *\r\n");
        
        // 对于POST请求,需要添加以下内容以允许Content-Type头
        if (isPostRequest) {
            buffer.append("Access-Control-Allow-Methods: POST\r\n");
            buffer.append("Access-Control-Allow-Headers: Content-Type\r\n");
        }
    
        // ...其他可能需要的响应头
    }
    

    然后,在调用HttpResponse::addHeader()方法时,确保传入一个参数表示是否为POST请求。

    另外,请注意,如果服务端仅支持POST请求的跨域,还需要在响应头中明确声明Access-Control-Allow-Methods

    前端无需改动,因为你已经正确配置了前端部分的跨域请求头和发送JSON数据的方式。

    最后,确保后端服务正确处理OPTIONS预检请求并返回相应的CORS响应头。对于大多数Web服务器框架或库来说,通常会有专门的中间件或模块处理CORS。如果你正在使用自定义的HTTP服务器实现,则需自行处理OPTIONS请求并附加正确的响应头。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月18日
  • 已采纳回答 3月10日
  • 创建了问题 2月27日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效