• NodeJs中使用JSONP和Cors实现跨域


    跨域是为了解决浏览器请求域名,协议,端口不同的接口,相同的接口是不需要实现跨域的。

    1.使用JSONP格式实现跨域

    实现步骤

    1.  动态创建一个script标签
    2.  src指向接口的地址
    3.  定义一个函数和后端调用的函数名一样

    实现代码 -- 在nodejs中使用http内置模块起一个服务,端口号为3000

    1. const url = require('url')
    2. const http = require('http')
    3. const server = http.createServer((req,res)=>{
    4. if(req.url === '/favicon.ico') return //图标忽略 --- 图标地址也会请求后台服务
    5. const {query,pathname} = url.parse(req.url,true) //若加上true这个参数,query字符串参数会自动转成对象格式
    6. //设置头部信息 状态为200 内容为JSON格式 如果要返回html片段这设置为text/html
    7. res.writeHead(200, { 'Content-Type': 'application/json' });
    8. if(pathname == '/api/data'){
    9. //定义对象,返回给前端的 数据
    10. const obj = {code:200,message:'jsonp形式返回给前端'}
    11. //返回一个JSON调用的函数
    12. res.end(`toFront(${JSON.stringify(obj)})`)
    13. }else{
    14. //简单处理了
    15. res.writeHead(404, { 'Content-Type': 'application/json' });
    16. res.end('404')
    17. }
    18. //jsonp跨域操作
    19. // console.log(req.url) //获取请求除域名外的地址 例如 localhost:300/api 只获取/api
    20. })
    21. server.listen(3000,()=>{
    22. console.log("服务已启动")
    23. })

    在客户端的代码

    1. <script type="text/javascript">
    2. //jsonp跨域步骤
    3. //1.动态创建一个script标签
    4. const newscript = document.createElement('script')
    5. //2.src指向接口的地址
    6. newscript.src = 'http://localhost:3000/api/data'
    7. document.body.appendChild(newscript )
    8. //3.定义一个函数和后端调用的函数名一样
    9. function toFront(res){
    10. //后台返回的数据 这个函数是后台服务调用过来的
    11. console.log(res)
    12. }
    13. script>

    执行的结果 ,返回一个JSON格式的文档

     2.使用cors实现跨域

    核心是将响应的数据头部设置一个'access-control-allow-origin':'*',允许所有接口来访问浏览器,把浏览器允许的接口设置开放就好了。若不设置会出现明显的跨域报错问题

    下面设置下头部信息

    1. const server = http.createServer((req,res)=>{
    2. if(req.url === '/favicon.ico') return //图标忽略 --- 图标地址也会请求后台服务
    3. const {query,pathname} = url.parse(req.url,true) //若加上true这个参数,query字符串参数会自动转成对象格式
    4. //设置头部信息 状态为200 内容为JSON格式 如果要返回html片段这设置为text/html
    5. //核心代码需要将头部的access-control-allow-origin 设置为*
    6. res.writeHead(200, { 'Content-Type': 'application/json','access-control-allow-origin':'*'});
    7. if(pathname == '/api/data'){
    8. //定义对象,返回给前端的 数据
    9. const obj = {code:200,message:'cors形式返回给前端'}
    10. //返回一个JSON调用的函数
    11. res.end(`${JSON.stringify(obj)}`)
    12. }else{
    13. //简单处理了
    14. res.writeHead(404, { 'Content-Type': 'application/json' });
    15. res.end('404')
    16. }
    17. //jsonp跨域操作
    18. // console.log(req.url) //获取请求除域名外的地址 例如 localhost:300/api 只获取/api
    19. })
    20. server.listen(3000,()=>{
    21. console.log("服务已启动")
    22. })

     客户端请求

    1. //cors跨域
    2. fetch('http://localhost:3000/api/data')
    3. .then(res=>res.json())
    4. .then(res=>console.log(res))

    结果如下

  • 相关阅读:
    ActiveMq学习⑨__基于zookeeper和LevelDB搭建ActiveMQ集群
    el-tree业务
    【数据结构】详解链表结构
    《Redis设计与实现》阅读总结-4
    Java在云原生的破局利器——AOT(JIT与AOT)
    【20221204】【每日一题】监控二叉树
    液压比例方向阀放大器组装
    可用来文本 图片 音频 控制生成 图像 的网络结构
    cnpm的安装与使用
    【TES720D-KIT】青翼科技支持双网口的全国产化四核CPU+FPGA处理器开发套件
  • 原文地址:https://blog.csdn.net/LiuJia20010827/article/details/133781876