当前位置: 首页 > news >正文

前端处理跨域的几种方式

什么是跨域

指一个域下文档或者脚本去请求另一个域下的资源,这里的跨域是广义的;

广义的跨域:
  • 资源提跳转:A链接、重定向、表单提交
  • 资源潜入:link、script、img、frame等dom标签,还有样式中background:url()、@font-face()等文件外链
  • 脚本请求:js发起的ajax请求、dom和js对象的跨域操作;

其实我们通常说的跨域是由 “浏览器同源策略限制” 的一类请求场景

什么是同源策略

同源策略(Same origin policy),简称SOP,是一种约定,它由Netscape公司1995年引入浏览器,它是浏览器核心也是最基本的安全功能,如果缺少同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指“协议+ 域名+ 端口”三种相同;

同源策略的目的

为了保证用户信息的安全,防止恶意网站窃取数据

同源策略限制的行为操作
  • cookie、localStorage、IndexDB无法读取 (不能共享cookie)
  • DOM和Js对象无法获得(不能相互操作dom)
  • Ajax请求不能发送(不能发送ajax请求)
跨域解决方案
  1. 通过jsonp跨域
  2. document.domain + iframe跨域
  3. location.hash + iframe
  4. window.name + iframe跨域
  5. postMessage跨域
  6. 跨域资源共享(CORS)
  7. nginx代理跨域
  8. nodejs中间件代理跨域
  9. WebSocket协议跨域

一、通过jsonp跨域

通常为了减轻web服务器的负载,我们把js、css、img等静态资源分离在另一台服务器上,在html页面中再通过相应的标签从不痛域名下加载静态资源,而被浏览器允许,基于此原理,我们可以通过动态创建script,再请求一个带参网址实现跨域通信。

  1. 原生实现
<script>var script = document.createElement('script');script.type = 'text/javascript';// 传参并指定回调执行函数为onBackscript.src = 'http://www.demo2.com:8080/login?user=admin&callback=onBack';document.head.appendChild(script);// 回调执行函数function onBack(res) {alert(JSON.stringify(res));}</script>
  1. jquery ajax
$.ajax({url: 'http://www.demo2.com:8080/login',type: 'get',dataType: 'jsonp',  // 请求方式为jsonpjsonpCallback: "onBack",    // 自定义回调函数名data: {}
});
  1. vue.js:
this.$http.jsonp('http://www.demo2.com:8080/login', {params: {},jsonp: 'onBack'
}).then((res) => {console.log(res); 
})

jsonp缺点:只能实现get一种请求

二、 document.domain + iframe跨域 此方案仅限主域相同,子域不同的跨域应用场景。

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

1.)父窗口:

<iframe id="iframe" src="http://child.demo.com/b.html"></iframe>
<script>document.domain = 'demo.com';var user = 'admin';
</script>

子窗口:

<script>document.domain = 'demo.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页面所有对象。

实现原理: 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:

<iframe id="iframe" src="http://www.demo2.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:

<iframe id="iframe" src="http://www.demo1.com/c.html" style="display:none;"></iframe>
<script>var iframe = document.getElementById('iframe');// 监听a.html传来的hash值,再传给c.htmlwindow.onhashchange = function () {iframe.src = iframe.src + location.hash;};
</script>

3.)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:

var proxy = function(url, callback) {var state = 0;var iframe = document.createElement('iframe');// 加载跨域页面iframe.src = url;// onload事件会触发2次,第1次加载跨域页,并留存数据于window.nameiframe.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.demo1.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.demo2.com/b.html', function(data){alert(data);
});

2.)proxy.html:
中间代理页,与a.html同域,内容为空即可。

3.)b.html:

<script>window.name = 'This is demo2 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:

iframe id="iframe" src="http://www.demo2.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.demo2.com');};// 接受domain2返回数据window.addEventListener('message', function(e) {alert('data from demo2 ---> ' + e.data);}, false);
</script>

2.)b.html:

<script>// 接收domain1的数据window.addEventListener('message', function(e) {alert('data from demo1 ---> ' + e.data);var data = JSON.parse(e.data);if (data) {data.number = 16;// 处理后再发回domain1window.parent.postMessage(JSON.stringify(data), 'http://www.demo1.com');}}, false);
</script>

六、 跨域资源共享(CORS)

普通跨域请求:只服务端设置Access-Control-Allow-Origin即可,前端无须设置,若要带cookie请求:前后端都需要设置。

需注意的是:由于同源策略的限制,所读取的cookie为跨域请求接口所在域的cookie,而非当前页。如果想实现当前页cookie的写入,可参考下文:七、nginx反向代理中设置proxy_cookie_domain 和 八、NodeJs中间件代理中cookieDomainRewrite参数的设置。

目前,所有浏览器都支持该功能(IE8+:IE8/9需要使用XDomainRequest对象来支持CORS)),CORS也已经成为主流的跨域解决方案。

1、 前端设置:

1.)原生ajax

// 前端设置是否带cookie
xhr.withCredentials = true;

示例代码:

var xhr = new XMLHttpRequest(); // IE8/9需用window.XDomainRequest兼容
// 前端设置是否带cookie
xhr.withCredentials = true;
xhr.open('post', 'http://www.demo2.com:8080/login', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('user=admin');
xhr.onreadystatechange = function() {if (xhr.readyState == 4 && xhr.status == 200) {alert(xhr.responseText);}
};

2.)jQuery ajax

$.ajax({...xhrFields: {withCredentials: true    // 前端设置是否带cookie},crossDomain: true,   // 会让请求头中包含跨域的额外信息,但不会含cookie...
});

3.)vue框架 在vue-resource封装的ajax组件中加入以下代码:

Vue.http.options.credentials = true
2、 服务端设置:

若后端设置成功,前端浏览器控制台则不会出现跨域报错信息,反之,说明没设成功。

1.)PHP后台:

response.setHeader("Access-Control-Allow-Origin", "http://www.domain1.com");  // 若有端口需写全(协议+域名+端口)
response.setHeader("Access-Control-Allow-Credentials", "true");

2.)Nodejs后台示例:

ar http = require('http');
var server = http.createServer();
var qs = require('querystring');
server.on('request', function(req, res) {var postData = '';// 数据块接收中req.addListener('data', function(chunk) {postData += chunk;});// 数据接收完毕req.addListener('end', function() {postData = qs.parse(postData);// 跨域后台设置res.writeHead(200, {'Access-Control-Allow-Credentials': 'true',     // 后端允许发送Cookie'Access-Control-Allow-Origin': 'http://www.demo1.com',    // 允许访问的域(协议+域名+端口)'Set-Cookie': 'l=a123456;Path=/;Domain=www.demo2.com;HttpOnly'   // HttpOnly:脚本无法读取cookie});res.write(JSON.stringify(postData));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.demo1.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.demo2.com:8080',changeOrigin: true,// 修改响应头信息,实现跨域并允许带cookieonProxyRes: function(proxyRes, req, res) {res.header('Access-Control-Allow-Origin', 'http://www.domain1.com');res.header('Access-Control-Allow-Credentials', 'true');},// 修改响应信息中的cookie域名cookieDomainRewrite: 'www.demo1.com'  // 可以为false,表示不修改
}));
app.listen(3000);
console.log('Proxy server is listen at port 3000...');

3.)Nodejs后台

ar 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));// 向前台写cookieres.writeHead(200, {'Set-Cookie': 'l=a123456;Path=/;Domain=www.demo2.com;HttpOnly'   // HttpOnly:脚本无法读取});res.write(JSON.stringify(params));res.end();
});
server.listen('8080');
console.log('Server is running at port 8080...');
2、 vue框架的跨域(1次跨域)

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

webpack.config.js部分配置:

module.exports = {entry: {},module: {},...devServer: {historyApiFallback: true,proxy: [{context: '/login',target: 'http://www.demo2.com:8080',  // 代理跨域目标接口changeOrigin: true,secure: false,  // 当代理某些https服务报错时用cookieDomainRewrite: 'www.demo1.com'  // 可以为false,表示不修改}],noInfo: true}
}

八、 WebSocket协议跨域

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

1.)前端代码:

<div>user input:<input type="text"></div>
<script src="./socket.io.js"></script>
<script>
var socket = io('http://www.demo2.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后台:

// 启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.'); });
});

九、 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配置一个代理服务器(域名与demo1相同,端口不同)做跳板机,反向代理访问demo2接口,并且可以顺便修改cookie中demo信息,方便当前域cookie写入,实现跨域登录。

nginx具体配置:

#proxy服务器
server {listen       81;server_name  www.demo1.com;location / {proxy_pass   http://www.demo2.com:8080;  #反向代理proxy_cookie_demo www.demo2.com www.demo1.com; #修改cookie里域名index  index.html index.htm;# 当用webpack-dev-server等中间件代理接口访问nignx时,此时无浏览器参与,故没有同源限制,下面的跨域配置可不启用add_header Access-Control-Allow-Origin http://www.demo1.com;  #当前端只跨域不带cookie时,可为*add_header Access-Control-Allow-Credentials true;}
}

1.) 前端代码示例:

var xhr = new XMLHttpRequest();
// 前端开关:浏览器是否读写cookie
xhr.withCredentials = true;
// 访问nginx中的代理服务器
xhr.open('get', 'http://www.demo1.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));// 向前台写cookieres.writeHead(200, {'Set-Cookie': 'l=a123456;Path=/;Domain=www.demo2.com;HttpOnly'   // HttpOnly:脚本无法读取});res.write(JSON.stringify(params));res.end();
});
server.listen('8080');
console.log('Server is running at port 8080...');

为以后方便用到,也是记录一下。尊重原创!

相关文章:

前端处理跨域的几种方式

什么是跨域 指一个域下文档或者脚本去请求另一个域下的资源&#xff0c;这里的跨域是广义的&#xff1b; 广义的跨域&#xff1a; 资源提跳转&#xff1a;A链接、重定向、表单提交资源潜入&#xff1a;link、script、img、frame等dom标签&#xff0c;还有样式中background:url(…...

《计算机网络A》单选题-复习题库

1. 计算机网络最突出的优点是&#xff08;D&#xff09; A、存储容量大B、将计算机技术与通信技术相结合C、集中计算D、资源共享 2. RIP 路由协议的最大跳数是&#xff08;C&#xff09; A、13B、14C、15D、16 3. 下面哪一个网络层次不属于 TCP/IP 体系模型&#xff08;D&a…...

网络安全威胁2024年中报告

下载地址&#xff1a; 网络安全威胁2024年中报告-奇安信...

Quartz - JDBC-Based JobStore事务管理及锁机制

​ 由于JDBC-Based JobStore在进行job注册、trigger注册、任务调度及执行过程中需要操作数据库&#xff0c;而且会涉及到多张表&#xff0c;比如trigger注册的时候会根据不同情况写入triggers、simple_triggers或cron_triggers表&#xff0c;在执行任务的时候会读取和更新trigg…...

机器学习作业 | 泰坦尼克号生存的预测任务

泰坦尼克号生存的预测任务 学校作业&#xff0c;我来水一水 环境&#xff1a;pycharmanaconda虚拟环境 文章目录 泰坦尼克号生存的预测任务0.环境搭建参考&#xff1a;1 目的与要求2 任务背景3 任务简介4 模型介绍1.决策树&#xff08;Decision Tree&#xff09;2.朴素贝叶斯…...

Tonghttpserver6.0.1.3 使用整理(by lqw)

文章目录 1.声明2.关于单机版控制台和集中管理控制台3.单机版控制台3.1安装&#xff0c;启动和查看授权信息3.2一些常见的使用问题&#xff08;单机控制台&#xff09;3.3之前使用的是nginx&#xff0c;现在要配nginx.conf上的配置&#xff0c;在THS上如何配置3.4如何配置密码过…...

图像坐标导数的表达式 Expression for Image Coordinate Derivate

Title: 图像坐标导数的表达式 Expression for Image Coordinate Derivate 文章目录 I. 图像坐标 Image CoordinatesII. 关于 x \mathbf{x} x 的导数 Derivative wrt x \mathbf{x} x1. 第一部分2. 第二部分3. 两部分合并 III. 关于 H H H 的导数 Derivative wrt H H H1. 第一…...

Jenkins 中自动化部署 Spring Boot 项目

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…...

Live555、FFmpeg、GStreamer介绍

Live555、FFmpeg 和 GStreamer 都是处理流媒体和视频数据的强大开源框架和工具&#xff0c;它们广泛应用于实时视频流的推送、接收、处理和播放。每个框架有不同的设计理念、功能特性以及适用场景。下面将详细分析这三个框架的作用、解决的问题、适用场景、优缺点&#xff0c;并…...

西门子DBX DBD DBB DBW的关系

DB10.DBD0 DB10.DBW0DB10.DBW2 DB10.DBB0DB10.DBB1DB10.DBB2DB10.DBB3 DB10.DBX0.00.7DB10.DBX1.01.7DB10.DBX2.02.7DB10.DBX3.03.7 使用之前需要在DB10中先定义&#xff0c;如果你仅在DB10中定义了一个DBD0&#xff0c;那么原则上你是可以使用上述所有地址的&#xff0c;但…...

语言模型在时间序列预测中的作用

语言模型在时间序列预测中的作用 从目前相关的研究情况来看,大语言模型在时间序列预测中的作用存在争议。 质疑其有用性的方面 消融研究结果:在对一些流行的基于语言模型(LLM)的时间序列预测方法进行消融研究时发现,去除LLM组件或将其替换为基本注意力层,在大多数情况下…...

【centos8 镜像修改】centos8 镜像修改阿里云

要将 CentOS 8 的镜像源修改为阿里云镜像&#xff0c;你需要编辑 /etc/yum.repos.d/ 目录下的 .repo 文件。以下是具体的步骤&#xff1a; 备份原始的 .repo 文件&#xff1a; 在编辑之前&#xff0c;建议备份原始的 .repo 文件&#xff0c;以便在出现问题时可以恢复。 sudo cp…...

2024年12月个人工作生活总结

本文为 2024年12月工作生活总结。 研发编码 Golang语言byte数组赋值 假定有如下变量&#xff1a; var strCode string var bCode [9]byte现需将string类型转换成byte类型&#xff0c;如下&#xff1a; bCode []byte(strCode)无法转换&#xff0c;提示&#xff1a; cannot…...

[cg] android studio 无法调试cpp问题

折腾了好久&#xff0c;native cpp库无法调试问题&#xff0c;原因 下面的Deploy 需要选Apk from app bundle!! 另外就是指定Debug type为Dual&#xff0c;并在Symbol Directories 指定native cpp的so路径 UE项目调试&#xff1a; 使用Android Studio调试虚幻引擎Android项目…...

vulnhub靶场【warzone】之2

前言 靶机&#xff1a;warzone-1&#xff0c;IP地址192.168.1.71 攻击&#xff1a;kali&#xff0c;IP地址192.168.1.16 都采用虚拟机&#xff0c;网卡为桥接模式 主机发现 因为都是同一局域网下&#xff0c;相当于内网环境&#xff0c;所以使用下面的工具&#xff0c;若想…...

MySQL什么情况下会加间隙锁?

目录 一、使用范围条件查询 二、唯一索引的范围查询 三、普通索引的查询 四、间隙锁的锁定规则 五、间隙锁的影响 间隙锁(Gap Lock)是MySQL中的一种锁机制,主要用于防止幻读现象。在MySQL的InnoDB存储引擎中,当事务隔离级别设置为可重复读(Repeatable Read)时,间隙…...

REDIS2.0

string list hash set 无序集合 声明一个key&#xff0c;键里面的值是元素&#xff0c;元素的类型是string 元素的值是唯一的&#xff0c;不能重复 多个集合类型之间可以进行并集&#xff0c;交集&#xff0c;集查的运算 sadd test1 a b c c d &#xff1a;添加5个元素&am…...

Java方法使用详解:从基本概念到进阶技巧

1. 方法介绍 方法是执行特定功能的代码块&#xff0c;可以被多次调用。方法由方法头和方法体组成&#xff0c;方法头包括方法名、参数列表和返回类型。方法体包含实际执行的代码。 2. 无参无返回值方法使用 这种方法没有参数&#xff0c;也不返回任何值。常用于执行一些不需…...

RT-Thread中堆和栈怎么跟单片机内存相联系

现在RT-ThreadMCU的应用方式越来越普遍&#xff0c;RT-Thread需要配置MCU中的RAM到的系统中&#xff0c;进入系统内存管理&#xff0c;才能提供给基于实时系统的应用程序使用&#xff0c;比如给应用程序提供malloc、free等函数调用功能。在嵌入式软件开发中&#xff0c;我们经常…...

对jenkins的rpm进行处理

下载Jenkins RPM包 首先&#xff0c;你需要从Jenkins官方网站&#xff08;https://pkg.jenkins.io/redhat - stable/&#xff09;下载合适的RPM包。通常&#xff0c;对于CentOS等基于RPM的系统&#xff0c;可以选择jenkins - <version>.noarch.rpm这种格式的包&#xff0…...

从Huggingface中下载数据集、模型

报错&#xff1a; 可能原因&#xff1a; 1. 服务器网络连接 这样就显示没有问题 2.访问权限问题 3.连接超时 4.使用镜像 使用镜像的方法在autodl上是可以成功的&#xff0c;但是在一些服务器却不能成功&#xff0c;那么就需要我们下载到本地&#xff0c;然后再把本地的打包…...

设计模式的分类

根据概念性动机分3类设计模式 创建型模式&#xff1a;管理对象的创建。 常用的有单例模式&#xff0c;简单工厂模式&#xff0c;工厂方法模式&#xff0c;另外还有原型模式&#xff0c;抽象工厂模式&#xff0c;建造者模式 结构型模式&#xff1a;将已有对象加入到设计中时…...

【图像去噪】论文精读:DualDn: Dual-domain Denoising via Differentiable ISP

请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中) 文章目录 前言Abstract1 Introduction2 Related W…...

张量与数据类型

Pytorch最基本的操作对象——张量&#xff08;tensor&#xff09;&#xff0c;张量是Pytorch中重要的数据结构&#xff0c;可认为是一个高维数组。一般的&#xff0c;标量&#xff08;scalar&#xff09;是只有大小没有方向的量&#xff0c;如1、2、3等&#xff1b;向量&#x…...

JavaScript概述

Web网页的三要素&#xff1a;HTML结构、CSS表现、JavaScript行为。 一、JavaScript语言的组成 JS的全称叫JavaScript&#xff0c;它一门面向对象的解释型弱类型语言。 JavaScript也是由3个部分来组成的&#xff1a;ECMAScript、DOM、BOM。 ECMAScript——它是JS的核心部分&a…...

tarjan算法——割边

今天也是小小的学了一个tarjan算法中的割边的一个应用 他和割点很像&#xff0c;都是用来处理无向图的&#xff0c;只不过是不能走反向边罢了 我们首先来说一个割边的定义 割边 当我们在无向图中删除一个边&#xff0c;无向图被分成不联通的两部分&#xff0c;那么这条边就…...

ESP32 I2S音频总线学习笔记(一):初识I2S通信与配置基础

文章目录 简介为什么需要I2S&#xff1f;关于音频信号采样率分辨率音频声道 怎样使用I2S传输音频&#xff1f;位时钟BCLK字时钟WS串行数据SD I2S传输模型I2S通信格式I2S格式左对齐格式右对齐格式 i2s基本配置i2s 底层API加载I2S驱动设置I2S使用的引脚I2S读取数据I2S发送数据卸载…...

Mybatisplus-IService

IService 是 MyBatis-Plus 提供的一个通用 Service 层接口&#xff0c;它封装了常见的 CRUD 操作&#xff0c;包括插入、删除、查询和分页等。通过继承 IService 接口&#xff0c;可以快速实现对数据库的基本操作&#xff0c;同时保持代码的简洁性和可维护性。 IService 接口中…...

深入浅出 Beam Search:自然语言处理中的高效搜索利器

Beam Search 技术详解 1. 引言 Beam Search 是一种广泛应用于自然语言处理&#xff08;NLP&#xff09;、机器翻译、语音识别等序列生成任务中的启发式搜索方法。本文将详细探讨 Beam Search 的原理、实现步骤、应用场景及其优缺点&#xff0c;并通过具体例子帮助读者更好地理…...

MySQL 可重复读隔离级别,完全解决幻读了吗?

什么是事务隔离级别&#xff1f; 事务隔离级别是数据库用来控制多个并发事务之间如何交互的机制。不同的隔离级别提供了不同程度的保护&#xff0c;以防止并发事务之间的相互干扰。MySQL 支持四种隔离级别&#xff1a; 读未提交&#xff08;Read Uncommitted&#xff09;&…...

Nginx知识详解(理论+实战更易懂)

目录 一、Nginx架构和安装 1.1 Nginx 概述 1.1.1 nginx介绍 1.1.2?Nginx 功能介绍 1.1.3?基础特性 1.1.4?Web 服务相关的功能 1.2?Nginx 架构和进程 1.2.1?Nginx 进程结构 1.2.2?Nginx 进程间通信 1.2.3?Nginx 启动和 HTTP 连接建立 1.2.4?HTTP 处理过程 1…...

VScode怎么重启

原文链接&#xff1a;【vscode】vscode重新启动 键盘按下 Ctrl Shift p 打开命令行&#xff0c;如下图&#xff1a; 输入Reload Window&#xff0c;如下图&#xff1a;...

华夏ERP系统部署

JDK安装及环境变量配置 数据库安装 Redis安装部署 Nginx安装部署 后端程序前端程序部署...

实际部署Dify可能遇到的问题:忘记密码、开启HTTPS、知识库文档上传的大小限制和数量限制

背景 前面我们以 docker compose 容器化的方式本地部署了 Dify 社区版&#xff0c;并快速体验了其聊天助手、工作量编排以及智能体&#xff08;Agent&#xff09;功能。不过后续实际生产环境使用时遇到了忘记密码、如何开启SSL以支持HTTPS、如何突破知识库文档上传的大小限制和…...

【C语言】库函数常见的陷阱与缺陷(三):内存分配函数[4]--free

C语言中的free函数用于释放之前通过malloc、calloc或realloc动态分配的内存。然而,在使用free函数时,开发者可能会遇到一些陷阱和缺陷。 一、功能与用法 free 函数是 C 语言中用于释放动态分配内存的关键函数。在程序使用 malloc、calloc 或 realloc 等函数在堆上分配了内存…...

【TypeScript篇】TypeScript命令行编译和自动化编译

目录 1. 命令行编译 步骤一&#xff1a;创建一个demo.ts文件 步骤二&#xff1a;全局安装TypeScript 步骤三&#xff1a;使用命令编译.ts文件 2. 自动化编译 步骤一&#xff1a;生成编译控制文件 步骤二&#xff1a;开启监视 3. 自动化编译的一些其它问题 1. 命令行编译…...

电子应用设计方案78:智能窗户系统设计

智能窗户系统设计 一、引言 智能窗户系统旨在为用户提供更便捷、舒适和节能的窗户控制体验&#xff0c;同时增强家居的安全性和智能化程度。 二、系统概述 1. 系统目标 - 实现窗户的自动开关控制&#xff0c;根据环境条件和用户设定进行操作。 - 具备风雨感应功能&#xff0c…...

数据挖掘笔记 | 插值 | 拉格朗日插值 | 龙格现象 | 埃尔米特插值 | 分段三次埃尔米特插值

Interpolation插值 ​ 对于缺失值的处理&#xff0c;比较常见的是数值分析中的插值和拟合这两种方法。插值指的是在离散数据的基础上补插连续函数&#xff0c;使得这条连续曲线通过全部给定的离散数据点&#xff1b;拟合则是找到一条“最优”的曲线&#xff0c;尽可能地贴近平…...

Ubuntu网络配置(桥接模式, nat模式, host主机模式)

windows上安装了vmware虚拟机&#xff0c; vmware虚拟机上运行着ubuntu系统。windows与虚拟机可以通过三种方式进行通信。分别是桥接模式&#xff1b;nat模式&#xff1b;host模式 一、桥接模式 所谓桥接模式&#xff0c;也就是虚拟机与宿主机处于同一个网段&#xff0c; 宿主机…...

【Linux网络编程】第十七弹---深入理解以太网与ARP协议:从帧格式到数据报解析

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、认识以太网 1.1、以太网帧格式 1.2、认识 MAC 地址 1.3、对比理解 MAC 地址和 IP 地址 1.4、认识 MT…...

AVL 树

1.AVL树的概念 AVL树是最先发明的自平衡二叉查找树&#xff0c;AVL树可以是一棵空树&#xff0c;或者具有以下性质的树&#xff1a;左右子树都是AVL树。且左右子树的高度差的绝对值不超过1。 AVL树是一颗高度平衡搜索二叉树&#xff0c;通过控制高度去控制平衡。 AVL树的发明…...

PHP关键字Self、Static和parent的区别

简介 在使用PHP代码时&#xff0c;您可能经常会遇到parent::、static::和self::。但是当你第一次作为一个开发人员开始的时候&#xff0c;有时候你会很困惑&#xff0c;不知道它们是做什么的&#xff0c;以及它们之间的区别。 在我第一次作为开发人员开始工作后的很长一段时间…...

Vscode左大括号不另起一行、注释自动换行

参考大佬的博客VSCode 格式化 cpp 文件时配置左大括号不换行_vscode大括号不换行-CSDN博客 Clang_format_style {BasedOnStyle: Chromium, IndentWidth: 4}...

golang标准库archive/tar实现打包压缩及解压

文章目录 前言一、单个文件操作1.单个文件打包示例2.单个文件解包示例 二、目录示例1.打包压缩2.解包 补充 前言 这个包就是将文件进行打包和解包&#xff0c;通俗理解就是Linux 下的 tar 命令。 主要是通过 tar.Reader 读取 tar 包&#xff0c;通过 tar.Writer 写入 tar包&am…...

模方匀色功能中,加载的模板文件从哪里来

使用 DasViewerV3.1.2及以上版本导出的颜色调整文件 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.2新增内置“自动UV展开”功能&#xff0c;新增局部调色功能和DOM匀色功能等。同时可与…...

maya 删除 Ctrl + Delete vs Delete

在 Autodesk Maya 中删除选定顶点的步骤&#xff1a; 1. 选择顶点&#xff1a; 进入顶点选择模式&#xff1a; 按 F9 键&#xff08;切换到顶点选择模式&#xff09;。 或者&#xff0c;在工具栏中点击顶点选择图标&#xff08;顶点模式&#xff09;。 在视图中选择您想要删…...

为何String不可变,String的运算符重载

1.为何String不可变 java9之前&#xff0c;String的源码中是用字符数组实现的&#xff0c;同时使用了final和private修饰&#xff0c;被final修饰的结果就是变量不可修改、类不可继承、方法不可重写&#xff0c;被private修饰就无法对外暴露&#xff0c;这就是为何String不可变…...

WebRTC :原理、协议和应用场景

WebRTC&#xff08;Web Real-Time Communication&#xff09;是一种用于在Web浏览器和移动应用程序之间进行实时通信的开放标准。它通过将音频、视频和数据传输集成到Web浏览器中&#xff0c;使得实时通信变得简单且无需任何插件或第三方软件。 一、WebRTC 的原理 WebRTC的实…...

Windows FTP服务器搭建指南

在Windows上搭建FTP服务器可以通过以下步骤完成。这里以Windows 10为例&#xff0c;使用系统自带的IIS&#xff08;Internet Information Services&#xff09;来搭建FTP服务器。 步骤1&#xff1a;安装IIS和FTP服务器组件 打开“控制面板”&#xff1a; 按 Win R&#xff0c…...

DP协议:Link层(二)

书接上文,内容多了难免会有一种知识点零碎感,但是坚持学下去,有一天你会发现已经不知不觉可以链接成一张知识网络了。 AUX提供的services 前面咱刚刚简单的认识了AUX CH的状态和仲裁,这次咱们接着聊聊AUX提供的services。 管理连接和设备:AUX CH就像是一个管家,负责找到…...