本地的网页跨域请求node.js服务,跳坑Access-Control-Allow-Origin: *

本文借鉴了
一位亲爱的博主的博客:
https://www.cnblogs.com/laowang-tester/p/12204445.html
再通过大神阮一峰的博客了解跨域资源共享 CORS :http://www.ruanyifeng.com/blog/2016/04/cors.html
最后得出自己的代码,内含一些知识点的注释,想了解这些知识最好看阮一峰的讲解

本地网页

 <!DOCTYPE html>
  <html>
       <head> 
           <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <title>client</title>
         </head> 
         <body>
            <button onclick="testClick()">点击</button>
            <br>
            <div id ="res_data"></div>
            <script type="text/javascript">
                function testClick(){
                    var HTTPrequest = new XMLHttpRequest();
                    HTTPrequest.withCredentials=false;

                    HTTPrequest.open("POST","http://127.0.0.1:8385/",true);
                    HTTPrequest.setRequestHeader("Content-Type","text/html; charset=utf-8");

                    //如果省略withCredentials设置,有的浏览器还是会一起发送Cookie。这时,可以显式关闭withCredentials。
                    HTTPrequest.withCredentials = false;

                    var msg = "this is a request"; //新建一个字符串,通过send方法发送给服务器
                    HTTPrequest.send(msg);
                    HTTPrequest.onload = function (e){
                        //本来是用jQuery操作dom的,后来改用原生的JavaScript操作dom了,我麻烦一下,大家方便就好
                        var p=document.createElement("p");
                        var text=document.createTextNode(HTTPrequest.responseText);
                        p.appendChild(text);
                        document.getElementById("res_data").appendChild(p);
                    }
                    HTTPrequest.onerror = function(e){
                        alert('请求失败');
                    }
                }
            </script>
 </body>
 </html>

node.js

var http = require('http');
 var PORT = 8385;
 http.createServer(function (req, res) {
     req.on('data', function(data) {
         console.log(data.toString());
     });
     //与CORS请求相关的字段,都以Access-Control-开头

     //表示是否允许发送Cookie。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。
     //res.setHeader("Access-Control-Allow-Credentials", "true"); 

     
     //该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。
     //本地html的orgin是null
     res.setHeader("Access-Control-Allow-Origin","null"); 

     /*
     需要注意的是,如果浏览器要发送Cookie,Access-Control-Allow-Origin就不能设为星号,
     必须指定明确的、与请求网页一致的域名。同时,Cookie依然遵循同源政策,
     只有用服务器域名设置的Cookie才会上传,其他域名的Cookie并不会上传,
     且(跨源)原网页代码中的document.cookie也无法读取服务器域名下的Cookie。
     */
     //res.setHeader("Access-Control-Allow-Origin","*");

     res.setHeader("Access-Control-Request-Method","PUT","POST","GET"); //非简单请求需要设置的
     res.setHeader("Access-Control-Allow-Headers", "Content-Type"); 
     res.setHeader("content-type", "text/html; charset=utf-8");
     var msg = "this is a response";
     res.end(msg);
 }).listen(PORT, function () {
     console.log('server is listening on port ' + PORT);
     })

node.js服务
请求成功,node响应

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值