首页 > 其他分享 >JSONP方式解决跨域

JSONP方式解决跨域

时间:2023-07-19 09:00:16浏览次数:33  
标签:跨域 script res params key JSONP 解决

 

<script>
    // 封装一个jsonp函数
    function jsonp({url, params, callback}) {
        return new Promise((resolve, reject) => {
            // 定义回调函数
            window[callback] = function(data) {
                resolve(data)
            }
          
            const script = document.createElement('script') // 创建script标签
            params = {...params, callback}
            const arr = []
            for(const key in params) {
                if(params.hasOwnProperty(key)) { // 判断当前key是否是params对象自身的属性,有可能会是原型上的属性,所以需要判断一下
                    arr.push(`${key}=${params[key]}`)
                }
            }
            url += `?${arr.join('&')}` // 拼接参数
            script.async = true
            script.src = url
            document.body.appendChild(script)
            script.onload = () => {
                document.body.removeChild(script)
            }
        })
    }
    // 使用jsonp
    jsonp({
        url: 'http://127.0.0.1:8081/hello',
        params:{id: '1'},
        callback: 'hello'
    }).then(res => {
        console.log('res:', res)
    })
</script>

其中8080为服务器端口

 

JSONP的实现原理:由于浏览器收同源策略的限制,网页无法通过Ajax请求非同源的接口数据,但是script标签不受浏览器同源策略的影响,可以通过src属性请求非同源js脚本。简而言之,JSONP的实现原理就是通过<script>标签的src属性,请求跨域的数据接口,并通过函数调用的形式,接收跨域接口响应回来的数据。

 

通过如下代码可以说明所有的script标签都是共享内容的

<body>
    <script>
        function success(res) {
            console.log(res);
        }
    </script>
    <script>
        var data = {
            name: 'zs',
            age: 20
        };
        success(data);
    </script>
</body>

 

注意事项:JSONP和Ajax之间没有任何关系,不能把JSONP请求数据的方式叫做Ajax,因为JSONP没有用到XMLHttpRequest这个对象。

参考:https://blog.csdn.net/qq_43781887/article/details/126915580

 

标签:跨域,script,res,params,key,JSONP,解决
From: https://www.cnblogs.com/zj68/p/17564651.html

相关文章

  • BeyondCompare4解决评估到期(避免商用)
    步骤win+R打开注册表进入计算机\HKEY_CURRENT_USER\SOFTWARE\ScooterSoftware\BeyondCompare4删除CacheID文件即可重置评估期限......
  • 解决调用Lib时无法找到其导出函数的问题
    问题:一个工程导出静态lib,另一个工程使用Lib中的函数,但是在编译时无法找到Lib中函数,使用dumpbin查看Lib确实导出函数了。解决:确保导出工程和使用工程的调用约定要一致,即C/C++->Advanced->CallingConvention的选项要相同,如都是__stdcall,这样调用时就不会有问题了。......
  • 【解决方法】通过二层互联实现AP 与AC 的互联与AP 的上线
    环境:工具:锐捷EVE模拟器,VMwareWorkstationPro远程工具:SecureCRT系统版本:Windows10问题描述:描述:搭建一个瘦AP网络环境,使用2层互联,用户与其他网段的通信都通过核心上的网关进行。提示:若按照教程还是无法完成操作,可以进入右侧的企鹅,找我看看。解决方法-视频与文......
  • Docker本地搭建个人企业私有云盘seafile搭建(完美解决ONLYOFFICE无法预览的情况)
    seafile搭建#创建存放路径mkdir-p/media/megrez/data/seafile/seafile-mysql/dbmkdir-p/media/megrez/data/seafile-data#创建docker-compose.ymldocker-copmse.yml内容如下version:'2.0'services:db:image:mariadbcontainer_name:seafile-mysql......
  • Windows远程“要求的函数不受支持”解决办法
    Windows远程“要求的函数不受支持”解决办法 解决方法:开启组策略中远程桌面链接安全层。1、开始-运行-gpedit.msc,进入组策略编辑器;2、找到左侧边栏计算机配置-管理模板-Windows组件-远程桌面服务-远程桌面会话主机-安全项;3、修改以下两项:  A,远程(RDP)连接要求使用指......
  • 计讯物联智慧景区应用解决方案,开启交互式智慧旅游新篇章
    方案背景后疫情时代,旅游市场逐步回暖。随着游客的旅游需求趋向个性化、多元化,景区的数字化转型升级势在必行。在此背景下,计讯物联充分发挥5G、云计算、物联网、大数据等技术的应用价值,以技术创新推动业务创新,面向全国大小景区全新打造智慧景区应用解决方案,以此提高景区整体运营管......
  • SpringBoot如何解决跨域问题
    什么是跨域跨域问题的本质是浏览器为了保证用户的一种安全拦截机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。跨域三种情况在发起请求时,如果出现了以下情况中的任意一种,那么它就是跨域请求:协议不同,如http和https;域名不同;端口不同。也就是说,即使域名相......
  • @NacosConfigListener注解监听配置变化失效解决
    项目初始配置:maven依赖如下:<!--配置与发现依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency&g......
  • GIS中按掩膜提取后栅格颜色错误的解决办法
    在GIS中对landsat8卫星图像进行按掩膜提取操作时,发现提取后即使是合成波段正确图像颜色也是错误的,类似下图:  排查错误后发现不是波段的问题,而是拉伸的问题,可以在符号系统—RGB合成—拉伸选项中将原有的“百分比截断”选项修改为“标准差”选项,按照需要调整n值,能够得到裁剪......
  • 导入大文件数据库报错500怎么解决?
    我们在数据库导入大文件的数据库时,会报错HTTP500InternalServerError的错误,HTTP500InternalServerError通常表示服务器无法处理请求,这有很多原因导致,下面我们来分析下可能的原因和解决方法。1、数据库文件过大:可以采用软件或第三方数据库管理工具导入,可以解决数据库文件......