js跨域的解决方案

news2024/11/27 13:17:01

一、什么是跨域?

指的是浏览器不能执行其他网站的脚本,简单来说是浏览器同源政策的限制,浏览器针对于ajax的限制。

同源政策

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

同源政策产生的目的

保护用户信息安全,防止一些网站盗取用户信息。

常见跨域场景 

在这里插入图片描述

二、跨域解决方案

1、通过jsonp跨域
2、跨域资源共享(CORS) 
3、document.domain + iframe跨域
4、location.hash + iframe
5、window.name + iframe跨域
6、postMessage跨域
7、nginx代理跨域
8、nodejs中间件代理跨域(非vue、vue(webpack--proxy代理))
9、WebSocket协议跨域

方案一:jsonp (json with padding)

原理:

1.动态创建一个script标签 

2.通过srcipt标签里的src属性 进行 跨域访问  属性里面写 跨域的地址+ callback属性作为函数传递给后端

3.服务端通过接收客户端传过来的callback属性值对应的函数名     

4.要发生过去的数据 通过函数的参数传递过去 (JSON格式)

5.将函数名对应调用的执行代码返回给客户端(服务器端响应数据一定是函数代码的调用,当浏览器对script将响应内容加载完成后,会自动调用函数)

6.并且在服务器端的执行函数是字符串,字符串包裹着函数调用的代码,如果没有包裹,则就在服务端立即执行。

缺点:只能发送get请求,易受到 XSS攻击
客户端代码

// 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})`);
});

 vue解决跨域问题- vue-jsonp

// 第一步:在vue项目中安装上vue-jsonp
npm i vue-jsonp --save

// 第二步:在vue项目中main.js导入
import { VueJsonp } from 'vue-jsonp'
Vue.use(VueJsonp)



// 使用示例:
this.$jsonp(url, {
    id: '1',
    output: "jsonp"
}).then(res => {
    console.log('res', res)
}).catch(err => {
    console.log(err)
})

方案二:CORS (CROSS-Origin Resource Sharing  跨域资源共享)

原理:服务器设置

同源政策默认阻止跨域获取资源,但是CORS给了web服务器权限,即服务器可以选择,允许访问他们的资源 。

CORS需要浏览器和服务器同时支持,才可以实现跨域请求,目前几乎所有浏览器都支持CORS,IE则不能低于IE10。CORS的整个过程都由浏览器自动完成,前端无需做任何设置,跟平时发送ajax请求并无差异。so,实现CORS的关键在于服务器,只要服务器实现CORS接口,就可以实现跨域通信。

属于跨源 AJAX 请求的根本解决方法。相比 JSONP 只能发GET请求,CORS 允许任何类型的请求。

分类:简单请求和复杂请求 

条件:
    1、请求方式:HEAD、GET、POST
    2、请求头信息:
        Accept
        Accept-Language
        Content-Language
        Last-Event-ID
        Content-Type 对应的值是以下三个中的任意一个
                                application/x-www-form-urlencoded
                                multipart/form-data
                                text/plain
 
注意:同时满足以上两个条件时,则是简单请求,否则为复杂请求

简单请求和复杂请求的区别:

简单请求:一次请求

复杂请求:两次请求,在发送数据之前会先发第一次请求做‘预检’,只有‘预检’通过后才再发送一次请求用于数据传输。

关于预检:

        在发送真正的请求之前,会默认发送一个options请求,做预检,预检成功后才发送真正的请求。

- 请求方式:OPTIONS
- “预检”其实做检查,检查如果通过则允许传输数据,检查不通过则不再发送真正想要发送的消息
- 如何“预检”
     => 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则“预检”不通过
        Access-Control-Request-Method
     => 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则“预检”不通过
        Access-Control-Request-Headers

实现:设置三个响应头 

1.Access-Control-Allow-Origin 字段  (指定了哪些域名或ip地址可以跨域 也可以写* 代表允许所有地址;允许跨域访问的域名:若有端口需写全(协议+域名+端口),若没有端口末尾不用加'/')

response.setHeater('Access-Control-Allow-Origin',' http://XXX.cn || * ||  ip地址  '); 

2.CORS默认支持9个请求头,如果在9个请求头之外 要单独设置,多个请求头之间要用英文逗号隔开。

// 提示OPTIONS预检时,后端需要设置的两个常用自定义头
response.setHeater('Access-Control-Allow-Headers','Content-Type,X-Requested-With'); 

3.默认情况下CORS仅支持客户端发起的GET、POST、HEAD请求,如果希望客户端发送PUT、DELETE请求需要在服务器端设置

response.setHeater('Access-Control-Allow-Method','GET'); 
// 允许前端带认证cookie:启用此项后,上面的域名不能为'*',必须指定具体的域名,否则浏览器会提示
response.setHeader("Access-Control-Allow-Credentials", "true");

和跨域CORS有关的几个请求头和响应头请求头 

请求头响应头
OriginAccess-Control-Allow-Origin
Access-Control-Request-HeadersAccess-Control-Allow-Headers
Access-Control-Request-MethodAccess-Control-Allow-Methods
Access-Control-Allow-Credentials
Access-Control-Expose-Headers
Access-Control-Max-Age

请求头:

  1. Origin:当前请求源,和响应头里的Access-Control-Allow-Origin 对标, 是否允许当前源访问,Origin是不可修改的
  2. Access-Control-Request-Headers:本次真实请求的额外请求头,和响应头里的Access-Control-Allow-Headers对标,是否允许真实请求的请求头
  3. Access-Control-Request-Method:本次真实请求的额外方法,和响应头里的Access-Control-Allow-Methods对标,是否允许真实请求使用的请求方法

响应头:
      1.Access-Control-Allow-Credentials:

这里的Credentials(凭证)其意包括:Cookie ,授权标头或 TLS 客户端证书,默认CORS请求是不带Cookies的,这与JSONP不同,JSONP每次请求都携带Cookies的,当然跨域允许带Cookies会导致CSRF漏洞。如果非要跨域传递Cookies,web端需要给ajax设置withCredentials为true,同时,服务器也必须使用Access-Control-Allow-Credentials头响应。此响应头true意味着服务器允许cookies(或其他用户凭据)包含在跨域请求中。另外,简单的GET请求是不预检的,即使请求的时候设置widthCrenditials为true,如果响应头不带Access-Control-Allow-Credentials,则会导致整个响应资源被浏览器忽略。

      2.Access-Control-Allow-Headers
      3.Access-Control-Allow-Methods
      4.Access-Control-Allow-Origin
      5.Access-Control-Expose-Headers:
        在CORS中,默认的,只允许客户端读取下面六个响应头(在axios响应对象的headers里能看到):

Cache-Control
Content-Language
Content-Type
Expires
Last-Modified
Pragma

如果这六个以外的响应头要是想让客户端读取到,就需要设置Access-Control-Expose-Headers这个为响应头名了,比如Access-Control-Expose-Headers: Token

      6. Access-Control-Max-Age:设置预检请求的有效时长,就是服务器允许的请求方法和请求头做个缓存。

补充:

根据头信息和请求方式,浏览器进行了优化,对请求进行划分,分为简单请求和非简单请求 

简单请求和非简单请求不做概述

简单请求 : 满足浏览器请求会直接发送 并在请求头中携带Origin 表示本次来自哪个源

如果不满足简单请求 , 会在发送请求之前发送一个预检请求 大小为0kb 请求方式为options  收到服务器响应后,分析它是否支持跨域,如果支持跨域则直接发送,如果不支持 报错!

JSONP和CORS的区别:
​JSONP:服务端不用修改,需要改前端。发jsonp请求​

​JSONP:只能发GET请求​

​CORS:前端的代码不用修改,服务端的代码需要修改。如果是简单请求的话在服务端加上一个响应头。​

​CORS:可以发任意请求

方案三:document.domain + iframe跨域 

此方案仅限主域相同,子域不同的跨域应用场景。

实现原理:两个页面都通过js强制设置document.domain为基础主域,就实现了同域。

 1.)父窗口:(http://www.domain.com/a.html)

<iframe id="iframe" src="http://child.domain.com/b.html"></iframe>

<script> 
    document.domain = 'domain.com';
    var user = 'admin'; 
</script>

2.)子窗口:(http://child.domain.com/b.html)

<script> 
    document.domain = 'domain.com';
    // 获取父窗口中变量
    alert('get js data from parent ---> ' + window.parent.user); 
</script>

方案四: location.hash + iframe跨域

实现原理: a欲与b跨域相互通信,通过中间页c来实现。 三个页面,不同域之间利用iframe的location.hash传值,相同域之间直接js访问来通信。

具体实现:A域:a.html -> B域:b.html -> A域:c.html,a与b不同域只能通过hash值单向通信,b与c也不同域也只能单向通信,但c与a同域,所以c可通过parent.parent访问a页面所有对象。

1.)a.html:(http://www.domain1.com/a.html)

<iframe id="iframe" src="http://www.domain2.com/b.html" style="display:none;"></iframe>

<script> 
    var iframe = document.getElementById('iframe');
    // 向b.html传hash值
    setTimeout(function() {
        iframe.src = iframe.src + '#user=admin';
    }, 1000);

    // 开放给同域c.html的回调方法
    function onCallback(res) {
        alert('data from c.html ---> ' + res);
    } 
</script>

2.)b.html:(http://www.domain2.com/b.html)

<iframe id="iframe" src="http://www.domain1.com/c.html" style="display:none;"></iframe>

<script> 
    var iframe = document.getElementById('iframe');

    // 监听a.html传来的hash值,再传给c.html
    window.onhashchange = function () {
        iframe.src = iframe.src + location.hash;
    }; 
</script>

3.)c.html:(http://www.domain1.com/c.html)

<script> 
    // 监听b.html传来的hash值
    window.onhashchange = function () {
        // 再通过操作同域a.html的js回调,将结果传回
        window.parent.parent.onCallback('hello: ' + location.hash.replace('#user=', ''));
    }; 
</script>

方案五:window.name + iframe跨域

window.name属性的独特之处:name值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持非常长的 name 值(2MB)。

1.)a.html:(http://www.domain1.com/a.html)

var proxy = function(url, callback) {
    var state = 0;
    var iframe = document.createElement('iframe');
    
    // 加载跨域页面
    iframe.src = url;

    // onload事件会触发2次,第1次加载跨域页,并留存数据于window.name
    iframe.onload = function() {
        if (state === 1) {
            // 第2次onload(同域proxy页)成功后,读取同域window.name中数据
            callback(iframe.contentWindow.name);
            destoryFrame();

        } else if (state === 0) {
            // 第1次onload(跨域页)成功后,切换到同域代理页面
            iframe.contentWindow.location = 'http://www.domain1.com/proxy.html';
            state = 1;
        }
    };

    document.body.appendChild(iframe);

    // 获取数据以后销毁这个iframe,释放内存;这也保证了安全(不被其他域frame js访问)
    function destoryFrame() {
        iframe.contentWindow.document.write('');
        iframe.contentWindow.close();
        document.body.removeChild(iframe);
    }
}



// 请求跨域b页面数据
proxy('http://www.domain2.com/b.html', function(data){
    alert(data);
});

2.)proxy.html:(http://www.domain1.com/proxy....
中间代理页,与a.html同域,内容为空即可。

3.)b.html:(http://www.domain2.com/b.html)

<script> window.name = 'This is domain2 data!'; </script>

总结:通过iframe的src属性由外域转向本地域,跨域数据即由iframe的window.name从外域传递到本地域。这个就巧妙地绕过了浏览器的跨域访问限制,但同时它又是安全操作。

方案六:postMessage跨域

postMessage是HTML5 XMLHttpRequest Level 2中的 API,且是为数不多可以跨域操作的window属性之一,它可用于解决以下方面的问题:
a.) 页面和其打开的新窗口的数据传递
b.) 多窗口之间消息传递
c.) 页面与嵌套的iframe消息传递
d.) 上面三个场景的跨域数据传递

用法:postMessage(data,origin)方法接受两个参数
        data: html5规范支持任意基本类型或可复制的对象,但部分浏览器只支持字符串,所以传参时最好用JSON.stringify()序列化。
        origin: 协议+主机+端口号,也可以设置为"*",表示可以传递给任意窗口,如果要指定和当前窗口同源的话设置为"/"。

1.)a.html:(http://www.domain1.com/a.html)

<iframe id="iframe" src="http://www.domain2.com/b.html" style="display:none;"></iframe>

<script> 
    var iframe = document.getElementById('iframe');
    iframe.onload = function() {
        var data = {
        name: 'aym'
    };

    // 向domain2传送跨域数据
    iframe.contentWindow.postMessage(JSON.stringify(data), 'http://www.domain2.com');


    // 接受domain2返回数据
    window.addEventListener('message', function(e) {
        alert('data from domain2 ---> ' + e.data);
    }, false); 
</script>

2.)b.html:(http://www.domain2.com/b.html)

<script> 
    // 接收domain1的数据
    window.addEventListener('message', function(e) {
        alert('data from domain1 ---> ' + e.data);
        var data = JSON.parse(e.data);
        if (data) {
            data.number = 16;

            // 处理后再发回domain1
            window.parent.postMessage(JSON.stringify(data), 'http://www.domain1.com');
        }
    }, false); 
</script>

方案七:nginx代理跨域

1、nginx配置解决iconfont跨域

浏览器跨域访问js、css、img等常规静态资源被同源策略许可,但iconfont字体文件(eot|otf|ttf|woff|svg)例外,此时可在nginx的静态资源服务器中加入以下配置。

location / {
    add_header Access-Control-Allow-Origin *;
}

2、nginx反向代理接口跨域

跨域原理: 同源策略是浏览器的安全策略,不是HTTP协议的一部分。服务器端调用HTTP接口只是使用HTTP协议,不会执行JS脚本,不需要同源策略,也就不存在跨越问题。

实现思路:通过nginx配置一个代理服务器(域名与domain1相同,端口不同)做跳板机,反向代理访问domain2接口,并且可以顺便修改cookie中domain信息,方便当前域cookie写入,实现跨域登录。

nginx具体配置:

#proxy服务器
server {
    listen 81;
    server_name www.domain1.com;
    location / {
        proxy_pass   http://www.domain2.com:8080;  #反向代理
        proxy_cookie_domain www.domain2.com www.domain1.com; #修改cookie里域名
        index  index.html index.htm;

        # 当用webpack-dev-server等中间件代理接口访问nignx时,此时无浏览器参与,故没有同源限制,下面的跨域配置可不启用
        add_header Access-Control-Allow-Origin http://www.domain1.com;  #当前端只跨域不带cookie时,可为*
        add_header Access-Control-Allow-Credentials true;
    }
}

1.) 前端代码示例:

var xhr = new XMLHttpRequest();

// 前端开关:浏览器是否读写cookie
xhr.withCredentials = true;

// 访问nginx中的代理服务器
xhr.open('get', 'http://www.domain1.com:81/?user=admin', true);
xhr.send();

2.) Nodejs后台示例:

var http = require('http');
var server = http.createServer();
var qs = require('querystring');

server.on('request', function(req, res) {
var params = qs.parse(req.url.substring(2));

// 向前台写cookie
res.writeHead(200, {
    'Set-Cookie': 'l=a123456;Path=/;Domain=www.domain2.com;HttpOnly'   // HttpOnly:脚本无法读取
});

res.write(JSON.stringify(params));
res.end();
});

server.listen('8080');
console.log('Server is running at port 8080...');

方案八:Nodejs中间件代理跨域

node中间件实现跨域代理,原理大致与nginx相同,都是通过启一个代理服务器,实现数据的转发,也可以通过设置cookieDomainRewrite参数修改响应头中cookie中域名,实现当前域的cookie写入,方便接口登录认证。

1、 非vue框架的跨域(2次跨域)

利用 node + express + http-proxy-middleware 搭建一个proxy服务器。

1.)前端代码示例:

var xhr = new XMLHttpRequest();

// 前端开关:浏览器是否读写cookie
xhr.withCredentials = true;

// 访问http-proxy-middleware代理服务器
xhr.open('get', 'http://www.domain1.com:3000/login?user=admin', true);
xhr.send();

2.)中间件服务器:

var express = require('express');
var proxy = require('http-proxy-middleware');
var app = express();

app.use('/', proxy({
// 代理跨域目标接口
target: 'http://www.domain2.com:8080',
changeOrigin: true,

// 修改响应头信息,实现跨域并允许带cookie
onProxyRes: function(proxyRes, req, res) {
    res.header('Access-Control-Allow-Origin', 'http://www.domain1.com');
    res.header('Access-Control-Allow-Credentials', 'true');
},

// 修改响应信息中的cookie域名
cookieDomainRewrite: 'www.domain1.com'  // 可以为false,表示不修改
}));

app.listen(3000);
console.log('Proxy server is listen at port 3000...');

3.)Nodejs后台同(六:nginx)

2、 vue框架的跨域(1次跨域)

通过服务器代理去发ajax 这个代理是webpack提供给我们的  因为服务器只是对ajax的同源限制,并不会限制服务器之间的通信。

利用 node + webpack + webpack-dev-server 代理接口跨域。在开发环境下,由于vue渲染服务和接口代理服务都是webpack-dev-server同一个,所以页面与代理接口之间不再跨域,无须设置headers 跨域信息了。

webpack.config.js部分配置:

//vue.config.js

module.exports = {
entry: {},
module: {},
...

devServer: {
    proxy: {
      // 如果请求地址以/api打头,就出触发代理机制
      // http://localhost:8080/api/login -> http://localhost:3000/api/login
      '/api': { // // 拦截以 /api 开头的url接口
        target: 'http://localhost:3000', //目标接口域名
        changeOrigin: true, //是否跨域
        ws: true, //如果要代理 websockets,配置这个参数
        secure: false, // 如果是https接口,需要配置这个参数
        //     // 标识替换
        //     // 原请求地址为 /api/getData 将'/api'替换''时,
        //     // 代理后的请求地址为: http://xxx.xxx.xxx/getData
        //     // 若替换为'/other',则代理后的请求地址为 http://xxx.xxx.xxx/other/getData 
        //     pathRewrite: { // 标识替换
        //       '^/api': '/'   //重写接口 后台接口指向不统一  所以指向所有/
        //       '^/api': '/api/mock'
        //     }
    }
  },

}

方案九:WebSocket协议跨域

WebSocket protocol是HTML5一种新的协议。它实现了浏览器与服务器全双工通信,同时允许跨域通讯,是server push技术的一种很好的实现。
原生WebSocket API使用起来不太方便,我们使用Socket.io,它很好地封装了webSocket接口,提供了更简单、灵活的接口,也对不支持webSocket的浏览器提供了向下兼容。

1.)前端代码:

<script src="https://cdn.bootcss.com/socket.io/2.2.0/socket.io.js"></script>

<script> 

var socket = io('http://www.domain2.com:8080');

// 连接成功处理
socket.on('connect', function() {
// 监听服务端消息
socket.on('message', function(msg) {
    console.log('data from server: ---> ' + msg);
});

// 监听服务端关闭
socket.on('disconnect', function() { 
    console.log('Server socket has closed.'); 
});


document.getElementsByTagName('input')[0].onblur = function() {
    socket.send(this.value);
}; 
</script>

2.)Nodejs socket后台:

var http = require('http');
var socket = require('socket.io');

// 启http服务
var server = http.createServer(function(req, res) {
res.writeHead(200, {
'Content-type': 'text/html'
});
res.end();
});

server.listen('8080');
console.log('Server is running at port 8080...');

// 监听socket连接
socket.listen(server).on('connection', function(client) {
// 接收信息
client.on('message', function(msg) {
client.send('hello:' + msg);
console.log('data from client: ---> ' + msg);
});

// 断开处理
client.on('disconnect', function() {
    console.log('Client socket has closed.'); 
});


 

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

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

相关文章

【SQL】作为前端,应该了解的SQL知识(第四弹)

&#x1f4d1;集合运算 集合运算就是对满足同一规则的记录进行的加减等四则运算。 &#x1f449; 对行数进行增减。 &#x1f4c3;UNION 取并集 集合运算符会去除重复的记录 SELECT product_id, product_nameFROM Product **UNION** SELECT product_id, product_nameFROM …

图神经网络:(图的分类)在MUTAG数据集上动手实现图神经网络

文章说明&#xff1a; 1)参考资料&#xff1a;PYG官方文档。超链。 2)博主水平不高&#xff0c;如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook。超链。提取码8848。 文章目录 MUTAG数据集说明图的小批量处理法图分类的基本流程改进算法 MUTAG数据集说…

Webpack4 应用

文章目录 Webpack4 应用处理CSS文件使用css-loader和style-loader内联CSS安装配置webpack.config.js编写源代码编译打包 使用css-loader和mini-css-extract-plugin外部链接CSS安装配置webpack.config.js编译打包 处理图片使用file-loader处理CSS图片安装file-loader配置webpack…

ChatGPT使用体验

ChatGPT使用体验 前言 介绍ChatGPT 体验ChatGPT 菜谱 编程学习 出行导航 导游攻略 中英翻译 电影推荐 文章总结 总结 前言 最近关于ChatGPT的话题已经火爆了&#xff0c;我也观察和体验了一段时间。平心而论&#xff0c;这东西真的黑科技&#xff0c;大多行业都能通…

Unity-Android 打包报错

目录 报错&#xff1a; 分析&#xff1a; 1.代码剔除等级设置 2.什么方式会被剔除 3.解决办法 报错&#xff1a; FileNotFoundException: Could not load file or assembly XXX or one of its dependencies at System.AppDomain.Load (System.String assemblyString, Sys…

AI低代码,或将再次颠覆开发行业

IT行业最不缺少概念&#xff0c;大多数人也都是一知半解。AI的火爆&#xff0c;低代码的盛行&#xff0c;如今AIGC低代码、AI低代码、智能开发、AI生成式开发、AIGS(AI生成软件)等等呼之欲出&#xff0c; AIGC&#xff08;AI Generated Content&#xff0c;AI生成内容&#xff…

攻防世界-web-php_rce

题目描述&#xff1a;无&#xff0c;只给了下面一张图&#xff08;PS&#xff1a;图中的链接没问题&#xff09; 1. 思路分析 图中信息给的不是很到位&#xff0c;需要有点外部知识&#xff0c;网上搜索ThinkPHP V5&#xff0c;可以看到是think php的一个历史高危漏洞&#x…

Grafana插件安装并接入zabbix数据源(03)

一、在线安装插件 如果不指定插件安装位置,则默认安装位置为/var/lib/grafana/plugins;插件安装后需要重启grafana-server 安装zabbix插件alexanderzobnin-zabbix-app # grafana-cli plugins install alexanderzobnin-zabbix-app 使用--pluginsDir指定安装路径 # grafana…

分库分表的 21 条法则,hold 住

不着急实战&#xff0c;咱们先介绍下在分库分表架构实施过程中&#xff0c;会接触到的一些通用概念&#xff0c;了解这些概念能够帮助理解市面上其他的分库分表工具&#xff0c;尽管它们的实现方法可能存在差异&#xff0c;但整体思路基本一致。因此&#xff0c;在开始实际操作…

【字典详细介绍】——python基础——如桃花来

目录索引 字典的意义和特征&#xff1a;创建字典的语法&#xff1a;创建空字典的两种形式&#xff1a;创建字典的形式&#xff1a;*直接用大括号包裹即可&#xff1a;* 字典的常见操作&#xff1a;新增及修改&#xff1a;删除&#xff1a;***语法&#xff1a;****clear()清空字…

【方法】PDF文档很多页,怎么提取并保存其中一页或多页?

​生活或工作中&#xff0c;PDF文档都很常见&#xff0c;有时候我们得到一份PDF文档&#xff0c;想要提取里面的内容&#xff0c;只需要其中一页或多页&#xff0c;或部分内容&#xff0c;那要怎么提取并保存下来呢&#xff1f;下面小编分享3个方法&#xff0c;简单快速解决问题…

大型集团数字化现状洞察,三步解决组织分级分权管理难题|身份云研究院

在经历全球范围的疫情冲击后&#xff0c;疫情对企业数字化转型的影响已经从初期被迫式、局部场景的“云办公”转化为长期深远地全场景影响。加之近年中美技术加速解耦&#xff0c;以及信创政策的加持下&#xff0c;中国企业在数字化转型中使用本地化解决方案代替原有的外企套装…

Linux 使用笔记(本人出品,必属精品)

文章目录 Part.I IntroductionChap.I 快应用Chap.II 课程所学 Part.II 基础知识Chap.X 杂记 Part.I Introduction Linux 是笔者在大四上学期学的&#xff0c;当时授课的刘老师现在还能偶尔见到。但是平时一般用 Windows&#xff0c;有机会接触 Linux 一般是偶尔在服务器上跑跑程…

Android还要继续学习吗?高薪高级开发领先位置占据一席之地

Android开发还有必要学习吗 &#xff1f; 我们来看Android从业大佬的回答&#xff1b;从回答中可以读取出一些信息&#xff0c;Android市场仍有岗位需求&#xff0c;只不过减少许多初级Android开发岗位。对于中高端市场还是面临着缺少人才&#xff1b;因为初级开发人员多啊&am…

数据治理实践-全面总结:小文件治理

01 背景 小文件是如何产生的&#xff1a; 日常任务及动态分区插入数据&#xff08;使用的Spark2 MapReduce引擎&#xff09;&#xff0c;产生大量的小文件&#xff0c;从而导致Map数量剧增&#xff1b; Reduce数量越多&#xff0c;小文件也越多(Reduce的个数和输出文件是对应…

Cube Map 系列之:手把手教你 使用 立方体贴图

什么是Cube Map 在开始立方体贴图之前&#xff0c;我们先简单了解下cube map。 cube map 包含了六个纹理&#xff0c;分别表示了立方体的六个面&#xff1b; 相较二维的纹理使用坐标uv来获取纹理信息&#xff0c;这里我们需要使用三维的方向向量来获取纹理信息&#xff08;一…

[PyTorch][chapter 33][卷积神经网络]

前言 参考&#xff1a; 《数字图像处理与机器视觉》 第五章 空间域图像增强&#xff0c; 图像卷积&#xff1a; 空间域图像增强 图像增强是根据特定需要突出一副图像中的某些信息&#xff0c;同时削弱或去除 某些不需要信息的处理方法,其主要目的是是的处理后的图像对某种特定的…

有人问C# web怎么部署iis上面

C# web怎么部署iis上面 C# web项目怎么来&#xff1f;&#xff1f;&#xff1f;IIS作用 IIS怎么开启步骤一&#xff1a;打开控制面板->程序->启动或关闭windows 功能->找到**Internet Information Services**步骤二&#xff1a;勾选 web管理工具&#xff0c;http错误&…

超好用的工具类网站分享,打工人必备!

今天给大家推荐几个超好用的工具类网站&#xff0c;无论是工作还是生活中堪称打工人必备工具。 Background Maker https://colorkit.co/background-maker/82cedd-b04a0d-56d8a9/ 网站内置了 7 种不同风格的背景&#xff0c;如渐变色、波浪、低三角形等&#xff0c;非常适合用作…

基于梯度提升决策树的组合特征方法,《百面机器学习》学习笔记

《百面机器学习》学习笔记&#xff1a;基于梯度提升决策树的组合特征方法 基于梯度提升决策树的组合特征方法梯度提升决策树这里举一个例子来说明梯度提升决策树的思想方法假设对于某种类型的输入&#xff0c;经过上述介绍的梯度提升决策树构建流程得到的模型如下图所示 基于梯…