JSONP 解决跨域问题

jsonp是跨域问题的一种解决方案,是一种常用的跨域手段,只支持JS脚本和JSON格式的数据本质是利用同源策略的漏洞

一、什么是跨域?

当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域

二、引起跨域的原因

1.浏览器安全限制

2. 同源策略

3. XHR(XMLHttpRequest)请求

三、跨域错误

跨域错误提示

四、解决方案

1. 写入配置文件

在nginx文件夹下的conf文件里有个nginx.conf文件,在location后面加上设置头部的属性,如下:
    location / {
            root  html/dist;  #打包后的dist根目录
            autoindex on;       #开启nginx目录浏览功能
            autoindex_exact_size off;   #文件大小从KB开始显示
            charset utf-8;          #显示中文
            
            #解决跨域问题
            add_header 'Access-Control-Allow-Origin' '*'; #允许来自所有的访问地址
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS'; #支持请求方式
            add_header 'Access-Control-Allow-Headers' 'Content-Type,*';
            add_header 'Access-Control-Allow-Headers' 'x_hztz_token,*';
    }
配置好nginx.conf文件后需要重启nginx服务器

2. jsonp解决

jsonp解决跨域问题

  1. 服务端: 将服务端返回数据封装到指定函数中返回 callback({返回数据})
  2. 客户端: 不管是我们的script标签的src还是img标签的src,或者说link标签的href他们没有被同源策略所限制,比如我们有可能使用一个网络上的图片,就可以请求得到;所以利用同源策略漏洞,将访问地址放在下面的标签的路径中,<script src="www.baidu.com">< img src=""/><link href=""/>来解决跨域的问题
下面直接放入源码
<body>
     <!-- 1. 设置点击事件 -->
    <button onclick="getData()">获取数据jsonp方式</button>

    <script>
        // 2. 设置点击事件,参数是一格回调函数myJsonp(),myJsonp()的参数是一个对象,对象中有url地址
        function getData(){
            myJsonp(
                {
                  url:"http://192.168.0.101/music/data/music_jsonp.json",
                }
            );
        }
        
        //3. 定义myJson()函数,创建script标签,设置src地址为请求的地址
        //利用同源策略漏洞, <script src="http://192.168.0.101/music/data/music_jsonp.json">
        function myJsonp(params){
            const scriptEle = document.createElement("script");

     //4. 回调函数,由系统调用,打印请求的数据结果
        function callback(responseData){
            console.log(responseData);
        }
    </script>
</body>

3. jquery中用jsonp解决

直接上源码

注意:jsonp只支持get请求,不支持post请求
<body>
    <button onclick="getData()">获取数据jsonp方式</button>
    
    <!-- 引入jquery -->
    <script src="js/jquery-3.4.1.js"></script>
    <script>
        function getData(){
            $.ajax({
                url:"http://192.168.0.101/music/data/music_jsonp.json",
                dataType: "jsonp", //返回数据类型
                jsonpCallback: "callback", //指定回调函数名
                success: function(res){
                    console.log(res);
                },
                error:function(err){
                    console.log(err);
                }
            })
        }
    </script>
</body>
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容