用node实现cors跨域

1. 关于跨域

浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,会导致跨域拿不到响应内容。
当一个请求 url 的协议、域名、端口三者之间任意一个与当前页面 url 不同即为跨域
h t t p s : / / ( 协 议 ) \color{#0000FF}{https://}(协议) https://() w w w . b a i d u . c o m ( 主 机 ) \color{#FF0000}www.baidu.com(主机) www.baidu.com() : 8080 ( 端 口 号 ) :\color{#FF00FF}8080(端口号) :8080()
早起开发者们为了解决这一问题使用了JSONP的方法进行处理(具体可看JSONP的原理,以及如何使用node实现)。但毕竟还是存在很多局限,于是有了cors。

2.CORS

当浏览器进行跨域请求的时候,会在请求里添加头部origin,表明自己协议,主机,端口。当服务器收到这个客户端发送的请求之后,如果需要允许能够访问,就需要添加头部信息Access-Control-Arrow-Origin到响应里面。浏览器收到传回来的这个头部信息就知道能不能进行跨域请求了。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
</html>
<script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
<script>
  $.ajax({ type: "get", url: "http://127.0.0.1:8888/get" }).then(
    (data) => {
      console.log(data);
    }
  );
</script>
let http = require('http')
let server = http.createServer()
server.listen(8888)
server.on('request', (req, res) => {
    var result = {
          code: 0,
          msg: "请求成功"
      }
      res.end(JSON.stringify(result))
})

在这里插入图片描述
我们在8080端口中运行一个html并且对8888端口的服务器发起请求,由于两者不在同一个端口所以发生了跨域。这段报错的意思是没有发现Access-Control-Arrow-Origin这个请求头,我们在Network里面也确实没发现这个头部。
在这里插入图片描述
针对这种情况,我们可以通过设置请求头Access-Control-Allow-Origin,允许跨域。

let server = http.createServer((req, res) => {
    res.writeHead(200, {
        'Access-Control-Allow-Origin':'http://127.0.0.1:8080'//可以是*,也可以是跨域的地址
    })
})

这时我们再去发起请求,可以看到响应头中的Access-Control-Allow-Origin属性,指向我们的客户端地址,这里我们也可以设置*即允许所有地址。并且我们这里也不再发生跨域的错误了。
在这里插入图片描述在这里插入图片描述

其他请求方式

如果我们将请求方式换成put请求会发现,它又发生跨域了
在这里插入图片描述
这是因为浏览器为了防护用户恶意修改浏览器数据,使用了例如put,delete等方法,我们可以通过设置请求头字段Access-Control-Allow-Methods,使得浏览器允许这些方法跨域

let server = http.createServer((req, res) => {
    res.writeHead(200, {
        'Access-Control-Allow-Origin': 'http://127.0.0.1:8080',//可以是*,也可以是跨域的地址
        'Access-Control-Allow-Methods': ['GET', 'POST', 'PUT']
    })
})

这时候再去发起请求就可以正常拿到响应内容了
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值