Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 494|回复: 0

jsonp前后端交互(解决跨域问题)

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-7-21 10:54:32 | 显示全部楼层 |阅读模式
    目标
    - 掌握jsonp的原理
    - 会搭建node服务器创建jsonp接口
    - 学会封装jsonp
    - 学会jsonp的实际运用
     知识要点
    - 跨域解决
    - jsonp原理及封装
    - jsonp服务器搭建
    - jsonp实际运用
     
    ajax问题
    - 浏览器同源策略

      - 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源
      - 源  :协议、域名和端口号

    - 跨域

    - 不受同源策略影响的资源的引入

      - <script src="..."></script>,<img>,<link>,<iframe>
    jsonp

    JSONP*(JSON with Padding)解决跨域问题;可以让网页从别的域名(网站)那获取资料,即跨域读取数据。

    - jsonp原理
     
    - 通过script来实现跨域;

    - 服务端实现

    - jsonp代码封装
    function ajax(options) {
        let opts = Object.assign({
            method: 'get',
            url: '',
            headers: {
                'content-type': 'application/x-www-form-urlencoded'
            },
            jsonp:"cb",
            data: '',
            success: function () { }
        }, options)
        //处理jsonp请求;
        if(opts.dataType==="jsonp"){
            jsonpFn(opts.url,opts.data,opts.jsonp,opts.success);
            return false;
        }
        function jsonpFn(url,data,cbName,cbFn){
            // cbName   cb/callback
            let fnName = "KKB_"+Math.random().toString().substr(2);
            window[fnName] = cbFn;
            let path = url+"?"+o2u(data)+"&"+cbName+"="+fnName;
            // console.log(path);
            let o = document.createElement("script");
            o.src = path;
            document.querySelector("head").appendChild(o);
        }
    
    
    
        let xhr = new XMLHttpRequest();
        if (options.method == "get") {
            let data = o2u(opts.data)
            options.url = options.url + "?" + data;
        }
        xhr.open(options.method, options.url, true);
        for (let key in opts.headers) {
            xhr.setRequestHeader(key, opts.headers[key]);
        }
        let sendData;
        switch (opts.headers['content-type']) {
            case 'application/x-www-form-urlencoded':
                sendData = o2u(opts.data);
                break;
            case 'application/json':
                sendData = JSON.stringify(opts.data);
                break;
        }
        xhr.onload = function () {
            let resData;
            if (xhr.getResponseHeader("content-type").includes("xml")) {
                resData = xhr.responseXML;
            } else {
                resData = JSON.parse(xhr.responseText);
            }
            options.success(resData);
        }
        if (options.method == "get") {
            xhr.send();
        } else {
            xhr.send(sendData);
        }
    }
    
    function o2u(obj) {
        let keys = Object.keys(obj);
        let values = Object.values(obj);
        return keys.map((v, k) => {
            return `${v}=${values[k]}`;
        }).join("&");
    }
    - 请求百度接口

      ```js
      https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=hello&cb=succFn
      ```
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <script src="jsonp.js"></script>
        <title>Document</title>
    </head>
    <body>
        <h1>百度搜索</h1>
        <input type="text" class="myinput" />
        <div class="exchange"></div>
    </body>
    <script>
    // console.log(ajax);
    document.querySelector(".myinput").onblur = function(){
        ajax({
            url:"https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su",
            dataType:"jsonp",
            data:{
                wd:this.value
            },
            success:function(res){
                let data = res.s;
                let html = "<ul>";
                data.forEach(v=>{
                    html += "<li>"+v+"</li>";
                })
                html += "</ul>";
                document.querySelector(".exchange").innerHTML = html;
            }
        })
    }
    </script>
    </html>

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-2 08:05 , Processed in 0.072584 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表