Node.js使用CORS解决跨域问题

跨域的定义和同源策略

跨域前,我们先了解什么叫同源策略(有时简称为SOP)是 Web 应用安全模型中的一个重要概念。根据该策略,网络浏览器允许包含在第一个网页中的脚本访问第二个网页中的数据,但前提是两个网页具有相同的来源。源定义为URI 方案、主机名和端口号的组合。此策略可防止一个页面上的恶意脚本通过该页面的文档对象模型获得对另一个网页上敏感数据的访问权。而只要违反了同源策略的行为就是跨域。
如以下图片所示,展示了,不同的url请求在同源策略下的结果
在这里插入图片描述

CORS解决跨域的策略

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
在这里插入图片描述

CROS配置特点

CORS响应头设置跨域参数

  • Access-Control-Allow-origin 设置支持哪些域名下的请求
    • 设置任何网站
  • Access-Control-Allow-Headers 设置最多九个请求头
    //设置请求头,设置编码
    res.setHeader(‘Content-Type’,‘text/html;charset=utf-8’)
  • Access-Control-Allow-Methods 设置客户端允许的请求,CORS仅支持get,post,head请求,如果需要其他的请求可以添加HTTP请求CORS预检请求

跨域的需要的其他条件

1.发送请求前,必须先进行一次option请求
2.除了CROS默认支持的三种请求之外的请求
3.请求头包含自定义头部字段
4.向服务器发送application/json格式数据

CORS使用

引入依赖

npm install  cors@2.8.5 

主启动文件

const express = require('express')
const app = express()
const cors = require('cors')
app.use(cors())
//引入JSONP
app.get('/api/JSONP',(req,res)=>{
   //得到函数名称
   const funcName = req.query.callback
   //定义数据对象
   const data = {name:'lin',age:20}
   //拼接出一个函数的调用
   const scriptstr = `${funcName}(${JSON.stringify(data)})`
   res.send(scriptstr)
})
//配置CORS
//const cors = require('cors')
//app.use(cors())
const router = require('./apiRouter')

app.use('/api',router)
app.listen(80,()=>{
    console.log("服务器启动")
})

路由

const express = require('express')
const appRouter = express.Router()
appRouter.get('/get',(req,res)=>{
    //通过res.query获取客户端数据
    const query = req.query
    //这个方法提取对象
    console.log("返回数据"+query.name)
    res.send(
     {  status:0, 
        data:query
     }
       
    )
    

})
appRouter.post('/post',(req,res)=>{
    //通过res.query获取客户端数据
    const body = req.query
    //这个方法提取对象
    console.log(body)
    res.send(
     {  status:0, 
        data:body
     }
       
    )
    

})
appRouter.delete('/delete',(req,res)=>{
    //通过res.query获取客户端数据
    const body = req.query
    //这个方法提取对象
    console.log(body)
    res.send(
     {  status:0, 
        data:body
     }
       
    )
    

})
appRouter.get('/jsonp',(req,res)=>{
    const funName = req.query.callback
    const data = {name:'zs',age:20}
    const scriptStr = `${funName}(${JSON.stringify(data)})`
    res.send(scriptStr)
})
module.exports = appRouter

页面

<!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>
    <script src='https://code.jquery.com/jquery-3.2.1.min.js'></script>
</head>
<body>
    <button id="get">Get</button>
    <button id="post">Post</button>
    <button id="delete">delete</button>
    <button id="jsonp">jsonp</button>
    <script>
        //测试get接口
       $(function(){
         $('#get').on('click',function(){
            $.ajax({
                type:'get',
                url:'http://localhost:80/api/get',
                data:{name:'lin',age:20},
                success:function(res){
                   console.log(res)
                }
            })
         })
         //测试post接口
         $('#post').on('click',function(){
            $.ajax({
                type:'post',
                url:'http://localhost:80/api/post',
                data:{name:'long',age:20},
                success:function(res){
                   console.log(res)
                }
            })
         })
        //测试post接口
        $('#delete').on('click',function(){
            $.ajax({
                type:'delete',
                url:'http://localhost:80/api/delete',
                data:{name:'long',age:20},
                success:function(res){
                   console.log(res)
                }
            })
         })
            //测试JSONP测试点击事件
            $('#jsonp').on('click',function(){
            $.ajax({
                type:'get',
                url:'http://localhost:80/api/jsonp',
            
                dataType:'jsonp',
                success:function(res){
                   console.log(res)
                }
            })
         })


       })
      </script>
</body>
</html>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值