跨域解决办法以及实现JSONP代码

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、为什么会产生跨域?

跨域是因为浏览器的同源策略引起的,同源策略是浏览器的一个安全机制,它阻止了不同域之间进行数据交互。只要协议、端口或域名其中有一个不同就会产生跨域。

二、解决跨域的九种方法

	1JSONP动态创建script标签和执行回调的方法 (只能发送GET请求)
	2CORS跨域资源共享 (需要前后端配合)
	3H5新增的POSTMessage
	4、document.domin + iframe
	5、location.hash + iframe
	6、window.name + iframe
	7、node 中间件
	8、nginx 代理
	9、websocket

三、JSONP实现代码

前端JS代码部分

// 在全局创建script标签,等数据请求结束之后方便删除
const scr = document.createElement("script")
const body = document.body
// 回调函数
function showData(data){
    console.log('收到的响应数据:',data)
    // 得到响应数据之后删除新创建的script标签
    body.removeChild(scr)
}
// 请求函数,通过向body中添加script标签
const JSONP = ({url,params,callback})=>{
	// newUrl 将请求地址和参数拼接在一起
    let newUrl = url + '?'
    for (let key in params){
        newUrl += `${key}=${params[key]}&`
    }
    // 最终的URL:http://127.0.0.1:3000/api/jsonp?name=dw&age=20&callback=showData
    const URL = `${newUrl}callback=${callback}`
    scr.setAttribute('src', URL)
    body.appendChild(scr)
}
// 调用JSONP函数
JSONP({
    url:'http://127.0.0.1:3000/api/jsonp',
    params:{name:'dw',age:20},
    callback:'showData'
})

后端Node.js代码

const express = require('express')
const app = express()
app.use(express.urlencoded({extended:false}))
app.get('/api/jsonp',(req,res)=>{
    // 定义 JSONP 接口具体的实现过程
    // 1.得到函数的名称
    const funcName = req.query.callback
    //2.定义要发送到客户端的数据对象
    const data = {status:1,message:'请求成功'}
    //3.拼接出一个函数的调用
    const scriptStr = `${funcName}(${JSON.stringify(data)})`
    //4.把拼接的字符串响应给客户端
    res.send(scriptStr)
})
app.listen(3000,_=>{
    console.log("Server is running")
})

结果截图
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值