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

突破Ajax跨域困境,解锁前端通信新姿势

一、引言

在当今的 Web 开发领域,前后端分离的架构模式已经成为主流,它极大地提升了开发效率和项目的可维护性。在这种开发模式下,前端通过 Ajax 技术与后端进行数据交互,然而,跨域问题却如影随形,成为了开发者们必须面对和解决的难题。

跨域问题的产生源于浏览器的同源策略,该策略出于安全考虑,限制了从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。当我们的前端页面和后端接口处于不同的域名、端口或协议时,就会触发跨域限制,导致 Ajax 请求无法正常进行。这一问题不仅影响了数据的正常传输,还可能导致用户体验的下降,因此,解决 Ajax 的跨域问题显得尤为重要。

在实际开发中,我们常常会遇到这样的场景:前端项目部署在http://localhost:8080,而后端接口却部署在http://api.example.com,当前端试图通过 Ajax 请求后端接口时,浏览器就会抛出跨域错误,使得数据无法成功获取。这不仅阻碍了开发进度,也给项目的稳定性和功能性带来了挑战。所以,掌握有效的跨域解决方案,对于每一位 Web 开发者来说,都是必备的技能。接下来,本文将详细介绍几种常见的解决 Ajax 跨域问题的方法,希望能为大家在开发过程中提供帮助。

二、跨域问题是什么

(一)同源策略

同源策略是浏览器的一种安全机制,它限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互 。这里的 “源” 由协议、域名和端口号共同决定。当且仅当两个页面的协议、域名和端口号都完全相同时,它们才属于同一个源。例如,http://www.example.com:8080与http://www.example.com:8080是同源的,而http://www.example.com:8080与https://www.example.com:8080(协议不同)、http://www.example.com:8080与http://api.example.com:8080(域名不同)、http://www.example.com:8080与http://www.example.com:8081(端口不同)都属于不同源。

在 Ajax 请求中,同源策略起着至关重要的作用。它主要限制了以下几个方面:

  • 禁止读取其他域下的 Cookie、LocalStorage 和 IndexDB:这意味着当前域下的 JavaScript 脚本无法访问其他域的这些存储数据,有效防止了敏感信息的泄露。例如,用户在银行网站登录后,恶意网站无法通过 JavaScript 获取银行网站的 Cookie,从而保障了用户的账户安全。
  • 禁止操作其他域下的 DOM:不同源的页面之间无法相互访问和修改对方的 DOM 结构,避免了恶意脚本对页面的篡改。比如,一个恶意网站不能通过脚本修改电商网站的商品价格显示区域,保证了页面内容的完整性和真实性。
  • 禁止 Ajax 发送跨域请求:这是同源策略对 Ajax 请求的直接限制,使得 JavaScript 只能向同源的服务器发送请求,防止了跨域数据窃取和恶意请求。例如,前端页面不能直接通过 Ajax 请求获取其他网站的用户数据,保护了用户隐私。

(二)跨域的定义

跨域是指浏览器不能执行其他网站的脚本,当从一个域名的网页去请求另一个域名的资源时,只要协议、域名、端口、子域名中有任何一个不同,就会产生跨域情况。这是浏览器基于同源策略对 JavaScript 施加的安全限制。

例如,有以下几种常见的跨域场景:

  • 协议不同:当前页面是Example Domain,请求的资源在Example Domain,由于协议分别为http和https,这就构成了跨域。
  • 域名不同:当前页面在Example Domain,而请求的资源在,不同的域名导致跨域。
  • 端口不同:当前页面运行在http://www.example.com:8080,请求的资源在http://www.example.com:8081,端口号的差异使得请求属于跨域。
  • 子域名不同:当前页面是http://sub1.example.com,请求的资源在http://sub2.example.com,虽然主域名相同,但子域名不同也会引发跨域问题。

(三)跨域问题产生的原因

跨域问题产生的根本原因是浏览器出于安全考虑,实施了同源策略。如果没有同源策略的限制,恶意网站可能会利用 JavaScript 进行各种恶意操作 ,例如:

  • 跨站请求伪造(CSRF)攻击:用户登录了银行网站,在未退出的情况下访问了恶意网站。恶意网站可以通过 JavaScript 发送伪造的请求到银行网站,利用用户已登录的身份执行转账等操作,而用户却毫不知情。
  • 信息窃取:恶意网站可以通过跨域请求获取其他网站的用户敏感信息,如账号密码、个人资料等,导致用户隐私泄露。

在 Ajax 请求中,当请求的目标服务器与当前页面不同源时,浏览器会根据同源策略对请求进行拦截。即使请求能够成功发送到服务器,并且服务器也能正常返回数据,但浏览器会阻止前端 JavaScript 获取服务器返回的响应,从而导致跨域问题的出现,使得数据无法正常交互,影响 Web 应用的功能实现。

三、跨域问题的常见场景

(一)前后端分离项目

在前后端分离的项目架构中,前端和后端通常是独立开发、独立部署的。前端项目一般运行在诸如http://localhost:8080这样的本地开发服务器上,而后端接口则可能部署在http://api.example.com或者http://localhost:3000等不同的服务器或端口上 。这种情况下,前端通过 Ajax 请求后端接口时,就会触发浏览器的同源策略限制,导致跨域问题的出现。

以一个电商项目为例,前端负责展示商品列表、购物车、用户界面等功能,而后端则负责处理商品数据的查询、订单的提交、用户信息的管理等业务逻辑。当前端页面需要获取商品列表数据时,会向http://api.example.com/api/products发送 Ajax 请求。然而,由于前端运行在http://localhost:8080,与后端接口的域名或端口不同,浏览器会认为这是一个跨域请求,从而阻止请求的正常进行,在控制台中抛出类似 “Access to XMLHttpRequest at 'http://api.example.com/api/products' from origin 'http://localhost:8080' has been blocked by CORS policy” 的错误信息,使得前端无法获取到所需的商品数据,影响页面的正常展示和功能实现。

(二)使用第三方 API

在 Web 开发中,我们常常会使用第三方提供的 API 来丰富应用的功能 。例如,在开发一个地图应用时,可能会调用百度地图或高德地图的 API 来获取地图数据、进行地址解析等;在开发一个新闻应用时,可能会调用今日头条或腾讯新闻的 API 来获取新闻资讯。

当调用第三方 API 时,由于其域名与我们自己的应用域名不同,必然会产生跨域问题。比如,我们的应用运行在应用宝官网-全网最新最热手机应用游戏下载,而百度地图的 API 接口地址为https://api.map.baidu.com。当我们在前端代码中使用 Ajax 请求百度地图的 API,如请求获取当前位置的经纬度信息时,浏览器会因为跨域限制而阻止请求,导致无法获取到地图相关的数据,影响应用中地图功能的正常使用。即使第三方 API 提供了丰富的功能,但跨域问题如果不解决,我们也无法顺利地将这些功能集成到自己的应用中。

四、解决 Ajax 跨域问题的方法

(一)JSONP

JSONP(JSON with Padding)是一种用于解决跨域数据访问问题的技术,它巧妙地利用了 script 标签无跨域限制的特性。在同源策略下,Ajax 请求受到严格的限制,无法直接访问不同源的资源,但 script 标签的 src 属性却可以加载任意来源的 JavaScript 脚本,JSONP 正是基于这一特性实现了跨域请求。

其原理是通过动态创建 script 标签,将请求数据的 URL 作为 script 标签的 src 属性值。当浏览器解析到这个 script 标签时,会向指定的 URL 发送请求,服务器接收到请求后,返回一段包含回调函数调用的 JavaScript 代码,该回调函数名通常由前端传递给服务器作为参数。前端在页面中事先定义好这个回调函数,当服务器返回的代码被浏览器执行时,就会调用前端定义的回调函数,并将数据作为参数传递进去,从而实现了跨域数据的获取。

在前端代码中,可以使用以下方式利用 JSONP 进行跨域请求,以 jQuery 为例:

$.ajax({type: "GET",url: "http://example.com/api/data", // 跨域请求的地址dataType: "jsonp", // 指定数据类型为jsonpjsonp: "callback", // 回调函数名的参数名,默认是callback,可自定义success: function(data) {// 处理返回的数据console.log(data);},error: function(e) {console.error("请求出错:", e);}});

通过设置dataType为jsonp,并指定jsonp参数为callback,告诉服务器回调函数名的参数是callback。服务器会根据这个参数名来返回相应的回调函数调用。

后端代码(以 Node.js 和 Express 为例)需要接收前端传递的回调函数名,并将数据以回调函数调用的形式返回:

const express = require('express');const app = express();app.get('/api/data', (req, res) => {const callback = req.query.callback;const data = { message: '这是来自服务器的数据' };// 将数据包装在回调函数中返回res.send(`${callback}(${JSON.stringify(data)})`);});app.listen(3000, () => {console.log('服务器运行在端口3000');});

服务器接收callback参数,将数据转换为 JSON 字符串,然后将其包装在回调函数中返回给前端。

JSONP 的优点十分显著,首先,它简单易用,无论是前端还是后端的实现都相对简单,不需要复杂的配置和处理。其次,它具有良好的兼容性,能够在各种浏览器中使用,包括一些较老的浏览器版本,这使得它在处理跨域问题时具有广泛的适用性。然而,JSONP 也存在一些缺点。一方面,它只支持 GET 请求,对于需要使用 POST 等其他请求方法的场景则无法满足需求,这在一定程度上限制了其应用范围。另一方面,JSONP 存在一定的安全风险,如果服务器返回的 JavaScript 代码被恶意篡改,可能会导致跨站脚本攻击(XSS),从而危及用户的信息安全。

(二)CORS(跨域资源共享)

CORS(Cross - Origin Resource Sharing)是一种 W3C 标准的跨域解决方案,它通过在服务器端设置特定的 HTTP 响应头,来明确地告诉浏览器哪些跨域请求是被允许的,哪些是被拒绝的,从而实现了安全的跨域资源访问。

其原理是,当浏览器发起一个跨域请求时,会首先检查服务器返回的响应头中是否包含Access-Control-Allow-Origin字段。如果该字段的值与请求的源(Origin)匹配,或者为*(表示允许任意源访问),则浏览器允许该跨域请求,并将服务器返回的数据传递给前端 JavaScript。此外,对于复杂请求(如 PUT、DELETE 请求,或者请求头中包含自定义字段的请求),浏览器会先发送一个预检请求(OPTIONS 请求),询问服务器是否允许该类型的请求。服务器在接收到预检请求后,会返回包含Access-Control-Allow-Methods、Access-Control-Allow-Headers等字段的响应头,告知浏览器允许的请求方法和请求头,只有在预检通过后,浏览器才会发送正式的请求。

在 Node.js 中,使用 Express 框架可以很方便地设置 CORS 相关的响应头,示例如下:

const express = require('express');const app = express();// 引入cors中间件const cors = require('cors');// 使用cors中间件,允许所有来源的请求app.use(cors());app.get('/api/data', (req, res) => {const data = { message: '这是来自服务器的数据' };res.json(data);});app.listen(3000, () => {console.log('服务器运行在端口3000');});

通过引入cors中间件并使用app.use(cors()),允许了所有来源的跨域请求。如果需要限制特定的来源,可以将cors()中的参数设置为一个对象,例如app.use(cors({ origin: 'http://localhost:8080' })),这样就只允许http://localhost:8080这个源发起的跨域请求。

前端发起跨域请求的代码与普通的 Ajax 请求并无区别,以原生 JavaScript 为例:

const xhr = new XMLHttpRequest();xhr.open('GET', 'http://example.com/api/data', true);xhr.onreadystatechange = function() {if (xhr.readyState === 4 && xhr.status === 200) {const data = JSON.parse(xhr.responseText);console.log(data);}};xhr.send();

CORS 的优点是非常明显的,它支持所有的 HTTP 请求方法,无论是 GET、POST、PUT 还是 DELETE 等,都能很好地处理,满足了各种复杂业务场景的需求。同时,它的安全性较高,通过服务器端的配置来控制跨域访问,有效地防止了非法的跨域请求,保障了数据的安全。然而,CORS 也存在一些局限性,它需要浏览器和服务器端同时支持才能正常工作。如果浏览器不支持 CORS 标准,或者服务器端没有正确配置响应头,都可能导致跨域请求失败。

(三)代理服务器

代理服务器是一种位于客户端和目标服务器之间的中间服务器,它的作用是将客户端的请求转发到目标服务器,并将目标服务器返回的响应再转发回客户端,从而绕过浏览器的同源策略限制,实现跨域请求。

其原理是利用了浏览器的同源策略只对跨域的 Ajax 请求进行限制,而对于同域的请求则不会限制这一特性。当客户端向代理服务器发送请求时,由于代理服务器与客户端处于同一域(或者在允许的跨域范围内),浏览器不会阻止该请求。代理服务器接收到请求后,根据配置将请求转发到目标服务器,目标服务器处理请求并返回响应,代理服务器再将响应返回给客户端,这样就实现了跨域数据的获取。

在开发环境中,使用webpack-dev-server设置代理非常方便。在webpack.config.js文件中,可以进行如下配置:

module.exports = {// 其他配置...devServer: {proxy: {'/api': {target: 'http://example.com', // 目标服务器地址changeOrigin: true,pathRewrite: {'^/api': '' // 路径重写,去掉请求路径中的/api}}}}};

在上述配置中,当客户端请求以/api开头的路径时,webpack-dev-server会将请求代理到Example Domain,并去掉请求路径中的/api。例如,客户端请求/api/data,实际会被代理到http://example.com/data。

在生产环境中,常用 Nginx 作为反向代理服务器。以下是一个简单的 Nginx 配置示例:

server {listen 80;server_name your_domain.com;location /api {proxy_pass http://example.com;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}

在这个配置中,当客户端请求your_domain.com/api时,Nginx 会将请求转发到Example Domain,并设置一些请求头信息,以保证请求的正常处理。

代理服务器的优点在于它可以处理各种复杂的跨域请求,无论是简单的 GET 请求还是复杂的 POST、PUT 等请求,都能轻松应对。同时,通过代理服务器可以对请求进行统一的处理,例如添加请求头、进行请求日志记录、实现请求缓存等,提高了系统的可维护性和扩展性。然而,使用代理服务器也有一些缺点,它增加了服务器的配置和维护成本,需要额外配置和管理代理服务器,并且在请求转发过程中可能会增加一定的延迟,影响请求的响应速度。

(四)WebSocket

WebSocket 是一种基于 TCP 协议的网络通信协议,它为浏览器和服务器之间提供了一种全双工通信的方式,允许在建立连接后,双方可以随时主动发送和接收数据,实现实时通信。在跨域通信方面,WebSocket 在建立连接时借助 HTTP 协议,通过 HTTP 的Upgrade头将通信协议从 HTTP 升级为 WebSocket,一旦连接建立成功,后续的数据传输就与 HTTP 无关了,因此可以实现跨域通信。

其原理是,当客户端发起 WebSocket 连接请求时,会在请求头中包含Origin字段,标识请求的来源。服务器在接收到请求后,可以根据自身的策略决定是否接受该连接。如果服务器允许跨域连接,就会返回相应的响应头,完成握手过程,建立起 WebSocket 连接。之后,客户端和服务器就可以通过这个连接进行双向的数据传输,不再受同源策略的限制。

以下是前端使用 WebSocket 进行跨域通信的示例:

const socket = new WebSocket('ws://example.com:8080/socket');socket.onopen = function(event) {console.log('连接已建立');socket.send('这是来自客户端的消息');};socket.onmessage = function(event) {console.log('收到服务器消息:', event.data);};socket.onerror = function(event) {console.error('连接出错:', event);};socket.onclose = function(event) {console.log('连接已关闭');};

创建了一个 WebSocket 连接到ws://example.com:8080/socket,并定义了onopen、onmessage、onerror和onclose事件处理函数,分别用于处理连接建立、接收消息、连接出错和连接关闭的情况。

后端使用 Node.js 和ws库实现 WebSocket 服务器的示例如下:

const WebSocket = require('ws');const wss = new WebSocket.Server({ port: 8080 });wss.on('connection', function connection(ws) {ws.on('message', function incoming(message) {console.log('收到客户端消息:', message);ws.send('这是来自服务器的响应');});ws.on('close', function() {console.log('连接已关闭');});ws.on('error', function(error) {console.error('连接出错:', error);});});

上边创建了一个 WebSocket 服务器监听在 8080 端口,当有客户端连接时,定义了onmessage、onclose和onerror事件处理函数,用于处理客户端发送的消息、连接关闭和连接出错的情况。

WebSocket 的优点是实时性强,能够实现客户端和服务器之间的实时数据交互,非常适合需要实时更新数据的应用场景,如在线聊天、实时游戏、股票行情显示等。同时,它支持全双工通信,双方可以随时主动发送数据,提高了通信的效率和灵活性。然而,WebSocket 也存在一些缺点,它的协议相对复杂,需要开发者对其原理和机制有深入的了解,增加了开发和调试的难度。此外,WebSocket 的兼容性不如 HTTP,在一些老旧的浏览器中可能不被支持,需要进行额外的兼容性处理。

五、不同方法的适用场景

在实际的 Web 开发中,选择合适的跨域解决方案至关重要,它不仅关系到项目的开发效率,还影响着系统的性能和安全性。以下是根据不同方法的特点,对其适用场景的详细分析:

  • JSONP:由于 JSONP 只支持 GET 请求,并且存在一定的安全风险,因此它更适用于一些简单的数据请求场景,例如获取一些静态的配置信息、公开的新闻资讯等。在这些场景中,数据的请求方式较为单一,且对安全性的要求相对较低。比如,在一个展示天气信息的页面中,需要从第三方天气 API 获取天气数据,此时可以使用 JSONP 来请求数据,因为天气数据通常是通过 GET 请求获取,且对安全性的要求不高,使用 JSONP 可以快速实现数据的获取和展示。另外,在一些老旧的系统中,如果无法对服务器进行复杂的配置,而又需要实现简单的跨域数据获取,JSONP 也是一个可行的选择。
  • CORS:CORS 支持所有的 HTTP 请求方法,并且安全性较高,适用于各种复杂的业务场景。在前后端分离的项目中,CORS 是首选的跨域解决方案。前端可以自由地使用各种请求方法与后端进行交互,无论是 GET 请求获取数据,还是 POST 请求提交表单、PUT 请求更新数据、DELETE 请求删除数据等,CORS 都能很好地支持。例如,在一个电商系统中,用户的注册、登录、下单等操作都需要与后端进行复杂的交互,使用 CORS 可以确保这些操作的顺利进行,同时保障数据的安全传输。此外,当需要与第三方 API 进行深度集成,且 API 支持 CORS 时,CORS 也是最佳选择,它可以满足各种复杂的请求需求,实现与第三方服务的无缝对接。
  • 代理服务器:代理服务器适用于需要对请求进行统一处理和管理的场景。在开发环境中,使用webpack-dev-server设置代理可以方便地解决跨域问题,同时还能对请求进行一些预处理,如添加请求头、进行请求转发等,提高开发效率。在生产环境中,Nginx 作为反向代理服务器,不仅可以解决跨域问题,还能实现负载均衡、缓存等功能,提高系统的性能和稳定性。例如,在一个高并发的 Web 应用中,通过 Nginx 作为代理服务器,可以将请求分发到多个后端服务器上,减轻单个服务器的压力,同时对跨域请求进行统一处理,确保系统的正常运行。
  • WebSocket:WebSocket 适用于需要实时通信的场景,如在线聊天、实时游戏、股票行情显示等。在这些场景中,需要客户端和服务器之间能够实时地交换数据,WebSocket 的全双工通信特性能够很好地满足这一需求。例如,在一个在线聊天应用中,用户发送的消息需要实时地显示在对方的聊天窗口中,使用 WebSocket 可以实现消息的即时推送,保证聊天的流畅性和实时性。再如,在股票交易系统中,股票的实时行情需要及时地展示给用户,WebSocket 可以实现行情数据的实时更新,让用户能够及时了解股票的价格变化。

六、总结

在 Web 开发的旅程中,跨域问题是我们不可避免会遇到的挑战,而解决 Ajax 跨域问题的方法多种多样,每种方法都有其独特的原理、实现方式和适用场景。

JSONP 利用 script 标签的特性实现跨域,简单易用,适用于简单的数据请求场景,但它仅支持 GET 请求且存在安全风险。CORS 作为一种标准的跨域解决方案,通过服务器端设置响应头来实现安全的跨域访问,支持所有 HTTP 请求方法,安全性高,广泛应用于各种复杂的业务场景。代理服务器通过转发请求绕过同源策略限制,能够处理复杂请求并对请求进行统一处理,在开发和生产环境中都有重要应用。WebSocket 则为实时通信场景提供了跨域支持,实现了客户端和服务器的全双工通信,实时性强,但协议相对复杂,兼容性需关注。

在实际开发中,我们不能盲目地选择一种方法来解决跨域问题,而是要根据项目的具体需求、业务场景以及安全性要求等多方面因素进行综合考量。只有这样,我们才能选择出最适合的跨域解决方案,确保项目的顺利进行和高效运行。同时,随着技术的不断发展和更新,我们也需要持续关注跨域问题的新解决方案和优化方法,不断提升自己的技术能力,以应对各种复杂的开发挑战。希望本文介绍的内容能够帮助大家在 Web 开发中更好地解决 Ajax 跨域问题,创造出更加优质的 Web 应用。

相关文章:

突破Ajax跨域困境,解锁前端通信新姿势

一、引言 在当今的 Web 开发领域,前后端分离的架构模式已经成为主流,它极大地提升了开发效率和项目的可维护性。在这种开发模式下,前端通过 Ajax 技术与后端进行数据交互,然而,跨域问题却如影随形,成为了开…...

Kotlin协变与逆变区别

在Kotlin中,协变和逆变是泛型编程中的两个重要概念,它们允许我们在类型系统中更加灵活地处理类型关系。 1.协变:协变允许我们使用比原始类型更具体的类型。在kotlin中,通过在类型参数上加out关键字来表示协变,生产者,例…...

driver中为什么要使用非阻塞赋值

1. 模拟硬件时序行为 实际硬件行为:DUT的输入信号通常在时钟边沿被采样。Driver需要确保信号的更新与时钟同步,而非阻塞赋值的延迟更新特性(在时间步结束时统一生效)能够准确模拟寄存器的行为。 示例: always (posedg…...

模板字符串【ES6】

“路漫漫其修远兮,吾将上下而求索。”—— 屈原《离骚》 目录 什么是模板字符串?模板字符串特性及代码举例:详细举例用法: 什么是模板字符串? 模板字符串(Template Literals)是JavaScript中引入…...

通往 AI 之路:Python 机器学习入门-数据结构

Python 数据结构 Python 提供了多种数据结构来存储和操作数据,其中列表(list)、字典(dict)、元组(tuple)和集合(set)是最常用的几种。本章将详细介绍这些数据结构的基本…...

我们应该如何优化UI(基于UGUI)

这是一道面试题,下面,我们来详细分析这个问题。 目录 1. 减少 Draw Call 合理设置图集 避免材质和 Shader 的频繁切换 减少 UI 元素的重叠 2. 优化UI布局 3. 优化UI元素的渲染 4.优化UI动画 5. 优化 UI 事件处理 6. 运行时优化 1. 减少 Draw C…...

CSS3 圆角:实现与优化指南

CSS3 圆角:实现与优化指南 随着网页设计的发展,CSS3 圆角已经成为了现代网页设计中不可或缺的元素之一。本文将详细讲解 CSS3 圆角的基本用法、实现方式以及优化技巧,帮助您在网页设计中更好地运用这一功能。 一、CSS3 圆角基本用法 1.1 基…...

【网络安全 | 扫描子域+发现真实IP】CloakQuest3r安装使用详细教程

原创文章,禁止转载。 本文仅作学习交流使用,不得用于非法渗透,笔者不承担任何责任。 文章目录 简介功能介绍执行流程限制安装步骤可选功能:SecurityTrails API使用示例简介 CloakQuest3r 是一款强大的 Python 工具,专为揭示受 Cloudflare 及类似服务保护的网站真实 IP 地…...

Mellanox OFED驱动如何给全局编译添加gcc的编译选项?(subdir-ccflags-y += -Wall)

背景 有些时候编译驱动需要给全局加一个编译选项,假设configure已经完成。可以直接在Makefile中修改 添加方式 修改OFED驱动目录下的: ./Makefile subdir-ccflags-y -Wall修改效果: 然后执行make,就能让添加的编译选项生效…...

【愚公系列】《Python网络爬虫从入门到精通》037-文件的存取

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...

【一起学Rust | Tauri2.0框架】单实例应用程序的深入解析:零漏洞实现与优化实战

文章目录 前言一、 单实例应用的意义二、 实现单实例应用的方法1 Windows下的实现1.1 创建命名Mutex1.2 在Tauri应用中集成Mutex检查 2 macOS下的实现2.1 获取Bundle Identifier2.2 检查是否已经有实例在运行 3 Linux下的实现3.1 获取进程列表3.2 检查是否已经有实例在运行 4 在…...

PhyloSuite v1.2.3安装与使用-生信工具049

PhyloSuite 一个好用的win集成建树平台,官方相关文档视频等做的可好了PhyloSuite (jushengwu.com) 官网 https://github.com/dongzhang0725/PhyloSuite/releases #官网 http://phylosuite.jushengwu.com/dongzhang0725.github.io/installation/ #官方说明文档…...

使用Apache Lucene构建高效的全文搜索服务

使用Apache Lucene构建高效的全文搜索服务 在现代应用程序中,全文搜索功能是不可或缺的一部分。无论是电子商务网站、内容管理系统,还是数据分析平台,快速、准确地搜索大量数据是提升用户体验的关键。Apache Lucene 是一个强大的全文搜索引擎…...

SSH远程登录并执行命令

SSH远程登录并执行命令 1、登录远程服务器2、远程执行命令3、远程执行交互命令4、远程执行脚本5、退出远程SSH连接 SSH是Linux中的远程连接管理工具,可以在本地服务器上通过SSH协议连接到远程服务器,并在远程服务器上执行命令 SSH不仅可以用来登录远程服…...

EasyRTC:支持任意平台设备的嵌入式WebRTC实时音视频通信SDK解决方案

随着互联网技术的飞速发展,实时音视频通信已成为各行各业数字化转型的核心需求之一。无论是远程办公、在线教育、智慧医疗,还是智能安防、直播互动,用户对低延迟、高可靠、跨平台的音视频通信需求日益增长。 一、WebRTC与WebP2P:实…...

Golang语言特性

1.Go语言的优势 1.1极简单的部署方式 —可以直接编译成机器码。代码可以直接转换为二进制数据,在操作系统上可以直接./去执行。 —不依赖其他库。最终生成的可执行程序是一个静态的二进制文本文件。 —可以直接运行即可部署。 —静态类型语言。编译的时候检查出来隐…...

LangPrompt提示词

LangPrompt提示词 https://github.com/langgptai/LangGPT 学习LangGPT的仓库,帮我创建 一个专门生成LangGPT格式prompt的助手 根据LangGPT的格式规范设计的专业提示词生成助手框架。以下是分步骤的解决方案: 助手角色定义模板 # Role: LangGPT提示词架…...

Java 容器之 List

在 Java 的集合框架中,List 是 Collection 的重要子接口,以其有序、可重复的特点广泛应用于开发中。本文将详细探讨 List 的核心概念、主要实现类(如 ArrayList 和 LinkedList)的底层原理,以及使用中需要注意的常见问题…...

ETL-kettle数据转换使用详解

一、excel转换成mysql 表格就按照我们刚才转换的表格来转换成MySQL数据 在MySQL数据库中创建数据库,这个根据自身情况。我就在现有test库中测试了。 根据以上步骤,新建转换。 构建流程图,选择excel输入和表输出 将两个组件连接起来 双击…...

【容器化】低版本docker拉取ubuntn 22.04镜像启动容器执行apt update提示 NO_PUBKEY 871920D1991BC93C

前置信息 宿主机信息 [root@localhost ~]# cat /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

LLM基础1_语言模型如何处理文本

基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

go 里面的指针

指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...