前端跨域问题

同源:

两个页面拥有相同的协议,端口,域名 就是同源,如果有一个不相同就是不同源。

jsonp

请求

// 1.封装一个jsonp函数;
jsonp({
    // method: 'GET',// 所有的jsonp请求都是get请求,所以这个属性可以不写了
    // data: , // 写了以后太繁琐,取消
    url: 'http://www.localhost:3006/api/jsonp',
    success: function (res) {
        console.log(res)
    }
})
 
// 封装
function jsonp(obj) {
    // 1.创建一个script标签;   2.改变src    3.给函数起名字,定义为全局函数;
    var script = document.createElement("script"); // 不要用innerHTML, 他不会自动发送请求
    // 3.给函数起名字,定义为全局函数;
    var fnName = "haha_123123";
    // window.aaa就是把aaa设置为全局变量!
    window[fnName] = obj.success;
    // 2.改变src,添加到head中
    script.src = obj.url + "?callback=" + fnName;
    // 把script标签添加到head标签中,就会发送src的请求了
    document.head.appendChild(script);
    // 代码执行完毕,把script标签删除
    script.onload = function () {
        document.head.removeChild(script);
        window[fnName] = undefined;
    }
}

处理

app.get("/api/jsonp", (req, res) => {
    // 获取函数名,设置对象,发送给客户端
    const fnName = req.query.callback;
    // 定义发送给客户端的对象转换为json字符串
    var objStr = JSON.stringify({
        name: '张三',
        age: 18
    });
    // 字符串类型的执行函数
    res.send(`${fnName}(${objStr})`);
});

window.postMessage

<script>
 function onLoad(){
     var iframe = document.getElementById("iframe");
     var win = iframe.contentWindow;
     win.postMessage('哈哈,我是来自页面a.html的信息哟!','*');//向不同域的www.script.com/b.html发送消息
 }
  </script>
<iframe id="iframe" src="www.script.com/b.html" οnlοad="onLoad()"></iframe>
<script>
 window.onmessage = function(e){//注册message时间来接收消息
     e = e || event;            //获取时间对象
     alert(e.data);             //通过data属性来得到传送的消息
 }
 </script>

使用跨域资源共享(CORS)来跨域

CORS:一种跨域访问的机制,可以让AJAX实现跨域访问;CORS允许一个域上的网络应用向另一个域提交跨域AJAX请求。
服务器设置Access-Control-Allow-Origin HTTP响应头之后,浏览器将会允许跨域请求.
就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功,还是应该失败。

Web sockets

web sockets: 是一种浏览器的API,它的目标是在一个单独的持久连接上提供全双工、双向通信。(同源策略对web sockets不适用)

web sockets原理:在JS创建了web socket之后,会有一个HTTP请求发送到浏览器以发起连接。取得服务器响应后,建立的连接会使用HTTP升级从HTTP协议交换为web sockt协议。

<script>
 var socket = new WebSockt('ws://www.test.com');
 //http->ws; https->wss
 socket.send('hello WebSockt');
 socket.onmessage = function(event){
     var data = event.data;
 }
posted @ 2022-09-07 14:58  helloSWZ  阅读(57)  评论(0编辑  收藏  举报