跨域:利用iframe实现跨域DOM互访的四种方式

news2024/11/19 2:16:56

注:跨域的知识点详见:跨域相关知识点

目录

实验验证环境配置:

1、利用document.domain降域

方法1:

方法2:

2、利用location.hash

3、利用window.name

4、利用postMessage(最推荐)

使用postmessage实现跨域访问

使用postmessage读取其他窗口的localstorage(普通款)

使用postmessage读取其他窗口的localstorage(加强版本):


实验验证环境配置:

我们一共需要配置五个虚拟主机,即需要使用五个域名

www.aaa.com、www.bbb.com、master.security.com、slave.security.com、www.security.com

(1)在本地的WWW目录下创建两个文件夹

cross_orgin和cross_orgin_sub

(2)域名分配:

cross_orgin:www.aaa.com

cross_orgin_sub:www.bbb.com

为了方便我们访问,这里需要在本地配置虚拟主机

(3)虚拟主机:

<VirtualHost *:80>
 DocumentRoot "F:/PHPstudy/phpstudy_pro/WWW/openlab/cross_orgin"
 ServerName  www.aaa.com
 FcgidInitialEnv PHPRC "F:/PHPstudy/phpstudy_pro/Extensions/php/php7.3.4nts"
 AddHandler fcgid-script .php
 FcgidWrapper "F:/PHPstudy/phpstudy_pro/Extensions/php/php7.3.4nts/php-cgi.exe" .php
 <Directory "F:/PHPstudy/phpstudy_pro/WWW/openlab/cross_orgin">
        Options FollowSymLinks ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
        Require all granted
        DirectoryIndex index.php index.html
</Directory>
</VirtualHost>
​
<VirtualHost *:80>
 DocumentRoot "F:/PHPstudy/phpstudy_pro/WWW/openlab/cross_orgin_sub"
 ServerName www.bbb.com
 FcgidInitialEnv PHPRC "F:/PHPstudy/phpstudy_pro/Extensions/php/php7.3.4nts"
 AddHandler fcgid-script .php
 FcgidWrapper "F:/PHPstudy/phpstudy_pro/Extensions/php/php7.3.4nts/php-cgi.exe" .php
 <Directory "F:/PHPstudy/phpstudy_pro/WWW/openlab/cross_orgin_sub">
        Options FollowSymLinks ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
        Require all granted
        DirectoryIndex index.php index.html
</Directory>
</VirtualHost>

 这里配置了两个虚拟主机:www.aaa.com 和 www.bbb.com分别对应的是我们所配置的

cross_orgin和cross_orgin_sub两个目录文件夹

(4)在vhost中配置ip与域名的对应关系

然后我们需要在本地环境的C:\Windows\System32\drivers\etc 目录下的vhost文件中增加对应关系

127.0.0.1 www.aaa.com
127.0.0.1 www.bbb.com

(5)我们可以在 cross_orgin和cross_orgin_sub 文件夹中任意创建页面文件,然后尝试使用域名进行访问

如果使用域名访问看到了编辑的页面内容,说明我们的环境已经搭建好了。

下面就详细的介绍一下ifame实现跨域DOM互访问的四种方式:

(6)

然后使用上面同样的方式完成master.security.com和slave.security.com和www.security,com这三个域名的搭建

这三个域名对应的是本地的cookie_orgin和cookie_orgin_sub、CSSinject文件夹

这里就只提供这三个域名的虚拟主机配置文件:

<VirtualHost *:80>
 DocumentRoot "F:/PHPstudy/phpstudy_pro/WWW/openlab/cookie_orgin"
 ServerName  master.security.com
 FcgidInitialEnv PHPRC "F:/PHPstudy/phpstudy_pro/Extensions/php/php7.3.4nts"
 AddHandler fcgid-script .php
 FcgidWrapper "F:/PHPstudy/phpstudy_pro/Extensions/php/php7.3.4nts/php-cgi.exe" .php
 <Directory "F:/PHPstudy/phpstudy_pro/WWW/openlab/cookie_orgin">
        Options FollowSymLinks ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
        Require all granted
        DirectoryIndex index.php index.html
</Directory>
</VirtualHost>

<VirtualHost *:80>
 DocumentRoot "F:/PHPstudy/phpstudy_pro/WWW/openlab/cookie_orgin_sub"
 ServerName slave.security.com
 FcgidInitialEnv PHPRC "F:/PHPstudy/phpstudy_pro/Extensions/php/php7.3.4nts"
 AddHandler fcgid-script .php
 FcgidWrapper "F:/PHPstudy/phpstudy_pro/Extensions/php/php7.3.4nts/php-cgi.exe" .php
 <Directory "F:/PHPstudy/phpstudy_pro/WWW/openlab/cookie_orgin_sub">
        Options FollowSymLinks ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
        Require all granted
        DirectoryIndex index.php index.html
</Directory>
</VirtualHost>

<VirtualHost *:80>
 DocumentRoot "F:/PHPstudy/phpstudy_pro/WWW/openlab/CSSinject"
 ServerName  www.security.com
 FcgidInitialEnv PHPRC "F:/PHPstudy/phpstudy_pro/Extensions/php/php7.3.4nts"
 AddHandler fcgid-script .php
 FcgidWrapper "F:/PHPstudy/phpstudy_pro/Extensions/php/php7.3.4nts/php-cgi.exe" .php
 <Directory "F:/PHPstudy/phpstudy_pro/WWW/openlab/CSSinject">
        Options FollowSymLinks ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
        Require all granted
        DirectoryIndex index.php index.html
</Directory>

注:虚拟主机中的目录文件需要与自己本地的文件配置一致,不要直接使用我这个 

1、利用document.domain降域

方法1:

master.security.com 的index.html文件:

方法1:
<!DOCTYPE html>
<html lang="en">
​
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Master</title>
</head>
​
<body>
    <h1>master</h1>
    <iframe id="iFrame" src="http://slave.security.com"></iframe>
    <!-- 这里将子页面嵌入到该页面中 -->
    <!-- 这里面填写子页面 -->
</body>
<script>
    document.domain = 'security.com'//domain进行降域不看子域名只看主域
    document.cookie = 'name=master'
</script>
</html>

这里将slave.security通过iframe嵌入到当前页面,并且这里在script标签中设置了document.domain,目的是让同样设置了这样的页面可以跨域互访,并还设置了一个document.cookie用于测试

    document.domain = 'security.com'//domain进行降域不看子域名只看主域
    document.cookie = 'name=master'

slave.security.com的index.html文件 : 

<!DOCTYPE html>
<html lang="en">
​
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>slave</title>
</head>
​
<body>
    <h1>slave</h1>
</body>
<script>
    document.domain = 'security.com'
    alert(document.cookie);
</script>
</html>

这里就是我们用来测试的页面与前面一样设置了document.domain,并且尝试弹出第一个文件设置的cookie值 

将文件创建后以后,我们可以尝试使用访问一下slave.security.com测试:

可以看到这里确实弹出了cookie,但是并不是文件1中设置的cookie,所以这种方法并没有实现真正的跨域互访DOM

方法2:

master.security.com 的index.html文件 :

<!DOCTYPE html>
<html lang="en">
​
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Master</title>
</head>
​
<body>
    <h1>master</h1>
    <iframe id="iFrame" src="http://slave.security.com"></iframe>
    <!-- 这里将子页面嵌入到该页面中 -->
    <!-- 这里面填写子页面 -->
</body>
<script>
    document.domain = 'security.com'//domain进行降域不看子域名只看主域名
    let ifr = document.getElementById('iFrame');
    ifr.onload = function () {//onload:等iFrame加载完成后再执行
        let win = ifr.contentWindow;//抓了子页面,赋值给win
        console.info(win);
        alert(win.data);//把这里抓到子页面的data弹窗出来
    }
</script>
​
</html>

这里和方法1一样设置了document.domain,但是不同的是,这里使用onload事件,必须要等到ifame加载完成后,在执行子页面的内容,然后这里还尝试将子页面的data尝试弹窗显示出来 

slave.security.com 的index.html文件:

<!DOCTYPE html>
<html lang="en">
​
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>slave</title>
</head>
​
<body>
    <h1>slave</h1>
</body>
<script>
    document.domain = 'security.com'
    window.data = "这是data:111"
</script>
​
</html>

这里也是设置了与前面相同document.doamin,与方法1不同的是,这里没有了弹窗,反而定义了一全局变量 

然后我们就可以尝试访问matser.security.com测试:

可以看到成功的弹窗了,并且弹出阿里data的值正是子页面定义的值,所以这里成功利用domain降域实现了跨域DOM互访

总:方法1在这个实验在浏览器中已经无法实现了,方法2可以正常实现

2、利用location.hash

(1)aaa.com(index.html文件)

   var ifr = document.createElement('iframe')
    ifr.src = 'http://www.bbb.com#data';
    ifr.style.display = 'none';
    document.body.appendChild(ifr);
    function checkHash() {
        try {
            let data = location.hash ? location.hash.substring(1) : ' ';
            console.log('获取到的数据为:', data);
        } catch (e) {
        }
    }
    checkHash();
    window.addEventListener('hashchange', function (e) {
        console.log('获取到的数据为:', location.hash.substring(1));
    });

这里首先将www.bbb.com子页面引入到本页面,并且增加一个锚点data,然后checkHash函数中进行了异常处理,try中对data进行判断,判断这是不是一个location.hash,如果是则取出#后的数据,不是就置为空,然后打印出data的数据 

后面再进行了对hashchange的监听

(2)bbb.com(index.html文件)

   switch (location.hash) { // 判断location1哈希
        case "#data":
            callback(); //调用函数
            break;
    }
    function callback() {
        const data = "some number:11111"
        try {
            parent.location.hash = data; //把自定义的值赋值给父页面的哈希值(即,改变了父页面的哈希)
        } catch (e) {
            //利用一个中间代理页面ifame(cs3.html)
            //要求:需要和第一个页面是同源
            var ifrproxy = document.createElement('iframe');
            ifrproxy.style.display = 'none';
            ifrproxy.src = "http://www.aaa.com/c.html#" + data;
            document.body.appendChild(ifrproxy);
        }
    }
    //获取父页面中的body标签中的内容

 这里对location.hash进行判断,如果是#data则调用回调函数,回调函数中对data进行了赋值,并且将该值赋值给了父级的location.hash,然后后面利用了c.html作为中间代理页面,将data值传给父级

(3)中间代理c.html文件

parent.parent.location.hash = self.location.hash.substring(1)

这里就是将自己的location.hash中后面#中的值,赋值给父级的父级也就是bbb.com的父级aaa.com 

(4)测试

我们尝试访问一下www.aaa.com

可以看到我们成功的使用c.html作为中间代理,使用www.aaa.com访问到了www.bbb.com中的值,实现了跨域DOM互访的目的

缺点:

  • 数据直接暴露在URL中

  • 数据容量和类型都有限

总:这种方法已经被淘汰了

3、利用window.name

windows.name(一般在js代码中出现)的值不是一个普通的全局变量,而是当前窗口的名字,要注意的是每个iframe都有包裹它的window,而这个window是top window的子窗口,而它自然也有window.name的属性。

window.name的属性的神奇之处就在于name的值在不同的页面(甚至不同的域名)加载后依然存在(如果没有修改则值不会变化),并且可以支持非常长的name值(2MB)

举一个简单的例子:你在某个页面的控制台输入:

window.name="hello world"
window.location="http://www.baidu.com"

页面跳转到了百度的页面,但是window.name却被保留下来,还是hello world

那么我们现在可以利用window.name这一性质来尝试进行跨域访问

(1)security.com(window_name.html)

    var ifr = document.createElement('iframe');
    ifr.style.display = 'none';
    ifr.src = "http://www.aaa.com";
    document.body.appendChild(ifr);
    ifr.onload = function () {
        ifr.onload = function () {
            let data = ifr.contentWindow.name;
            console.info(data);
        }
        ifr.src = "http://www.security.com/c.html"
    }

这里的windo_name.html文件中使用iframe将www.aaa.com作为子页面引入到当前页面,然后使用加载时间,来获取当前页面的,window.name值,并且打印出来,后面还指定了监听源为:www.security.com/c.html 

(2)www.aaa.com(index.html)

    window.name = "hello aaaa";

这里只需要定义一个window.name即可 

(7)c.html

(8)测试

可以看到这里成功的访问到了www.aaa.com中定义的window.name的值,并且,当前的Window.name的值为' '

总:当www.security.com/window_name.html在请求远端服务器www.aaa.com的数据时,我们可以在该页面下新建一个iframe,该iframe的src属性指向服务器地址(利用iframe标签的跨域能力),服务器文件aaa.com设置好了window.name值

但是由于window_name页面与aaa.com页面的iframe的src不同源的话,则无法操作iframe里面的任何东西,所以就取不到iframe的name值,所以我们只需要在aaa.com加载完成后重新换一个src指向同一个源的html文件,或者设置about:blank都行,这时候我们只要在window_name相同的目录下创建一个c.html空白文件即可,如果不重新指定src的话直接获取window.name就会报错

注:以上的方式均属于hack

4、利用postMessage(最推荐)

使用postmessage实现跨域访问

(1)security.com

  window.onload = function () {
        let targetOrigin = 'http://www.aaa.com'; //想要去的地址,即给它发送消息
        window.frames[0].postMessage('向aaa.com发送消息', targetOrigin);
    }
    window.addEventListener('message', function (e) {
        console.log('security.com接收到的消息', e.data);
    });

这里使用了一个事件监听着一个函数,函数中的tarOrigin指向www.aaa.com,这里表示为发送消息的接收地址,后面使用Postmessage向aaa.com发送消息,后面监听了消息这个事件 

(2)aaa.com

方案1:  
window.addEventListener('message', function (e) {
        if (e.source != window.parent)
            return;
        let data = e.data;
        console.log("aaa.com接收到的消息", data);
        // window.frames[0].postMessage("向aaa.com发消息", targetOrgin);
        parent.postMessage('aaa.com发送security', e.origin);
    }, false);

 这里定义了一个监听事件,监听消息,如果消息的源不是父级传递来的,则直接返回,否则将父级消息赋值给data,并且打印出来,然后后面也使用了postmessage向www.security发送消息

方案2:
    window.addEventListener('message', receiveMessage);
    function receiveMessage(event) {
        if (event.origin !== 'http://www.security.com') return;
        //事件的源地址
        if (event.data === 'Hello World') {
        //事件的内容
            event.source.postMessage('Hello', event.origin);
            
} else {
            console.log(event.data);
        }
    }

这里的实现是使用了event的几个属性来实现的 

(3)测试

方案1:

可以看到,www.aaa.com和www.security.com都互相收到了跨域发送的消息

方案2:

这里可以看到www.security也成功的接收到了ww.aaa发送的消息

使用postmessage读取其他窗口的localstorage(普通款)

(1)security/index.html

 window.onload = function () {
        let targetOrigin = 'http://www.aaa.com'; //想要去的地址,即给它发送消息
        var obj = { name: '杨攀帅', age: 20, 'wigth': 100 }
        window.frames[0].postMessage(
            JSON.stringify({ key: 'storage', method: 'set', data: obj }), targetOrigin
        );
    }
    window.addEventListener('message', function (e) {
        console.log('security.com接收到的消息', e.data);
    });

(2)aaa.com/index.html

    window.addEventListener('message', receiveMessage);
    function receiveMessage(event) {
        if (event.origin !== 'http://www.security.com') return; //信息来源判断
        var payload = JSON.parse(event.data);
        localStorage.setItem(payload.key, JSON.stringify(payload.data))
    }

(3)测试

可以看到,aaa.com页面成功使用postmessage读取到了security.com页面中的数据,并且存储到了本地

使用postmessage读取其他窗口的localstorage(加强版本):

(1)security/index.html

 window.onload = function () {
        let targetOrigin = 'http://www.aaa.com'; //想要去的地址,即给它发送消息
        var obj = { name: 'yps', age: 20, 'wigth': 100 }
        //加强版
        window.frames[0].postMessage(
            JSON.stringify({ key: 'storage', method: 'set', data: obj }),
            'http://www.aaa.com'
        );
        window.frames[0].postMessage(
            JSON.stringify({ key: 'storage', method: 'get' }),
            '*'
        );
        window.frames[0].postMessage(
            JSON.stringify({ key: 'storage', method: 'remove' }),
            '*'
        );
    }
    window.onmessage = function (e) {
        if (e.origin != 'http://www.aaa.com') return;
        console.log(JSON.parse(e.data).name
        );
    };

这里的大致思路和上面一样,那为什么说它是一个加强版本呢,因为,这里我们可以自己选择时set、还是get、还是remove Messageage发送的消息 

需要注意的是,要想让数据存储下来,需要将remove注释掉,否则将无法正常的读取到数据

(2)aaa.com/index.html

window.addEventListener('message', receiveMessage);
    function receiveMessage(event) {
        if (event.origin !== "http://www.security.com") return;
        var payload = JSON.parse(event.data)
        switch (payload.method) {
            case 'set':
                localStorage.setItem(payload.key, JSON.stringify(payload.data))
                break;
            case 'get':
                var parent = window.parent;
                var data = localStorage.getItem(payload.key)
                parent.postMessage(data, 'http://www.security.com/')
                break;
             case 'remove':
                 localStorage.removeItem(payload.key)
                 break;
            default:
                break;
        }
    }

这里也是增加了set、get、remove的选项看,并且完成了对应操作的实现 

(3)测试

这里也是一样的,可以看到,aaa.com页面成功使用postmessage读取到了security.com页面中的数据,并且存储到了本地

注:如果在将数据存入数据中没有转换/存储时转换为JSON格式时会报错

到这里使用iframe实现跨域DOM互访的几种方法已经介绍完毕了,更多跨域的内容请看下篇分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1196339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux发展史(必看系列)

Linux介绍&#xff1a; Linux&#xff0c;Linux Is Not UniX 的首字母缩写。是一款开源的&#xff0c;能自由传播的类Unix的操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布&#xff0c;它主要受到…

表格图片太大怎么批量压缩?最简单的批量压缩图片

我们在给表格添加图片的时候&#xff0c;如果体积太大&#xff0c;就会导致图片导入不进去&#xff0c;所以在使用之前最好是选择将图片压缩&#xff0c;有的小伙伴会说几张图片处理起来比较方便&#xff0c;如果是大量的话&#xff0c;就比较废时间了&#xff1b;所以今天就特…

贪心

【深基12.例1】部分背包问题 题目描述 阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 N ( N ≤ 100 ) N(N \le 100) N(N≤100) 堆金币&#xff0c;第 i i i 堆金币的总重量和总价值分别是 m i , v i ( 1 ≤ m i , v i ≤ 100 ) m_i,v_i(1\le m_i,v_i \le 100) mi​,vi​(…

HCIA-hybrid经典小实验

hybrid经典小实验 实验拓扑配置实现SW1SW2 配置验证PC1-PC3 不能通信PC1-PC2 正常通信其他自行测试 实验拓扑 配置实现 SW1 sysname SW1 # undo info-center enable # vlan batch 10 20 30 # interface Ethernet0/0/1 //接口发送该vlan-id的数据帧时&#xff0c;不剥离帧中的…

科研检测机构服务预约小程序的效果如何

科研检测机构涵盖的业务比较广&#xff0c;比如水质检测、农产品检测、食品检测等&#xff0c;对相关从业者来说&#xff0c;可能需要频繁使用这些业务&#xff0c;或者个人偶尔需要一些东西检测。 对用户和检测机构来说&#xff0c;由于行业的特殊性&#xff0c;在实际发展中…

网络安全基础之php开发文件上传的实现

前言 php是网络安全学习里必不可少的一环&#xff0c;简单理解php的开发环节能更好的帮助我们去学习php以及其他语言的web漏洞原理 正文 在正常的开发中&#xff0c;文件的功能是必不可少&#xff0c;比如我们在论坛的头像想更改时就涉及到文件的上传等等文件功能。但也会出…

山西电力市场日前价格预测【2023-11-12】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-12&#xff09;山西电力市场全天平均日前电价为224.59元/MWh。其中&#xff0c;最高日前电价为434.30元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

【代码随想录】算法训练计划17

1、 110.平衡二叉树 题目&#xff1a; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 思路&#xff1a; 经典后序遍历&#xff0c;感…

Ansible自动化运维工具及模块

目录 一、Ansible 1.ansible简介 2、ansible的特性 二、ansible的部署 1&#xff09;管理端安装ansible 2&#xff09;配置主机清单 3&#xff09;配置密钥对验证 三、ansible命令块模块 1&#xff09;command模块 2&#xff09;shell模块 3&#xff09;cron模块 4)…

软件测试之Web自动化测试,Web自动化测试的详细流程和步骤

一、什么是web自动化测试 自动化&#xff08;Automation&#xff09;是指机器设备、系统或过程&#xff08;生产、管理过程&#xff09;在没有人或较少人的直接参与下&#xff0c;按照人的要求&#xff0c;经过自动检测、信息处理、分析判断、操纵控制&#xff0c;实现预期的目…

无缝集成GORM与Go Web框架

探索GORM与流行的Go Web框架之间的和谐集成&#xff0c;以实现高效的数据管理 高效的数据管理是每个成功的Web应用程序的基础。GORM&#xff0c;多才多艺的Go对象关系映射库&#xff0c;与流行的Go Web框架非常搭配&#xff0c;提供了无缝集成&#xff0c;简化了数据交互。本指…

C++使用线程池模拟异步事件处理机制

在C很多框架中都有异步事件处理机制&#xff0c;这导致我们在看源码时经常很疑惑&#xff0c;难以理解&#xff0c;而其中包含的编程套路可能是一些成熟的技术&#xff0c;只是我们不熟悉&#xff0c;比如WebRTC中类似于Qt的信号槽机制&#xff0c;线程事件处理, 或者使用系统异…

玩转Linux基本指令

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;牢记Linux的基本指令。 > 毒鸡汤&#xff1a;挫…

2023 年最好的 Android 系统修复/刷机应用程序和软件

任何 Android 设备要顺利运行&#xff0c;其操作系统必须运行良好。幸运的是&#xff0c;对于大多数 Android 用户来说&#xff0c;这是不间断的。设备运行良好&#xff0c;打电话、共享文档等都没有问题。尽管如此&#xff0c;Android 操作系统可能会停止运行。这可能是由于特…

Postman for Mac(HTTP请求发送调试工具)v10.18.10官方版

Postman for mac是一个提供在MAC设备上功能强大的开发&#xff0c;监控和测试API的绝佳工具。非常适合开发人员去使用。此版本通过Interceptor添加了对请求捕获的支持&#xff0c;修正了使用上下文菜单操作未复制响应正文的问题和预请求脚本的垂直滚动条与自动完成下拉列表重叠…

ios开发 之 多线程

目录 第一节&#xff1a;多线程简介 线程执行原理 主线程 多线程解决方案 pthread __bridge NSThread 线程的状态 第二节&#xff1a;多线程访问资源 Synchronized nonatomic 、atomic 自动释放池 属性修饰符 第三节&#xff1a;消息循环 消息模式 第四节&…

人工智能基础_机器学习022_使用正则化_曼哈顿距离_欧氏距离_提高模型鲁棒性_过拟合_欠拟合_正则化提高模型泛化能力---人工智能工作笔记0062

然后我们再来看一下,过拟合和欠拟合,现在,实际上欠拟合,出现的情况已经不多了,欠拟合是 在训练集和测试集的准确率不高,学习不到位的情况. 然后现在一般碰到的是过拟合,可以看到第二个就是,完全就把红点蓝点分开了,这种情况是不好的, 因为分开是对训练数据进行分开的,如果来…

三掌柜第2期赠书活动:《计算机考研精炼1000题》

引言 各位朋友大家好&#xff0c;我是三掌柜。今天&#xff0c;三掌柜赠书第2期启动&#xff0c;本次为大家精选了《计算机考研精炼1000题》这本书。关于这本书的内容&#xff0c;非常丰富&#xff0c;涵盖计算机考研的高频知识内容&#xff0c;不管是正在备考&#xff0c;还是…

JUC下常见类

JUC(java.util.concurrent) 的常见类ReentrantLock原子类线程池信号量SemaphoreCountDownLatch JUC(java.util.concurrent) 的常见类 ReentrantLock ReentrantLock可重入互斥锁. 和 synchronized 定位类似, 都是用来实现互斥效果, 保证线程安全。 用法: lock(): 加锁, 如果获…

合同审查---财务条款、合同形式与生效审查

1.合同主体 1人 廖 2.财务条款、合同形式与生效 1人 黄 3.履行、验收、知识产权、不可抗力 1人 詹 4.违约责任、争议解决、保密、法律引用 1人 王 代码规范&#xff1a; 1.代码函数的层级 各审查点在json中分为3级层级&#xff0c;但用python写规则的时候&#xff0c;1级层级为…