突破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,这就构成了跨域。
- 端口不同:当前页面运行在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 技术与后端进行数据交互,然而,跨域问题却如影随形,成为了开…...
Docker 学习(一)
一、Docker 核心概念 Docker 是一个开源的容器化平台,允许开发者将应用及其所有依赖(代码、运行时、系统工具、库等)打包成一个轻量级、可移植的“容器”,实现 “一次构建,随处运行”。 1、容器(Container…...
【漫话机器学习系列】111.指数之和的对数(Log-Sum-Exp)
在计算机科学和机器学习中,经常会遇到计算指数和的对数的情况,例如: 然而,由于指数函数 的值增长极快,直接计算可能会导致数值上溢(overflow)或下溢(underflow)…...
算法004——盛最多水的容器
力扣——盛最多水的容器点击即可跳转 当我们选择1号线和8号线时,下标为 1 和 8 形成容器的容积的高度是由 较矮的决定的,即下标为 8 的位置; 而宽度则是 1到8 之间的距离,为 8-17,此时容器的容积为 7 * 7 49。 当我…...
前端内存泄漏的几种情况及方案
前端内存泄漏是常见但容易被忽视的问题,可能导致页面卡顿、崩溃或性能下降。以下是几种典型场景及解决方案: 1. 未清理的全局变量 场景: 意外创建全局变量(未使用 var/let/const)。主动挂载到 window 的大对象未释放…...
14. LangChain项目实战1——基于公司制度RAG回答机器人
教学视频: 12. 基于Gradio搭建基于公司制度RAG_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11VXRYTErZ/ 环境配置: python版本:3.10.8 服务器:Ubuntu 依赖包requirements.txt文件内容: aiofiles23.2.1 …...
解锁 indexOf、substring 和 JSON.stringify:从小程序图片上传看字符串魔法 ✨
🌟 解锁 indexOf、substring 和 JSON.stringify:从小程序图片上传看字符串魔法 ✨ 在 JavaScript 中,字符串操作和数据序列化是开发中不可或缺的技能。indexOf、substring 和 JSON.stringify 是三个简单却强大的工具,分别用于定位…...
Git快速入门
文章目录 Git简介准备工作常用的Linux命令git配置 git工作原理git项目创建和克隆git基本操作命令git忽略文件配置ssh远程连接 IDEA集成Gitgit分支(多人开发)公司中用到的(很清楚) Git 简介 Git就是版本控制的工具 下面这个叫手动…...
老牌工具,16年依然抗打!
在电脑还没普及、操作系统为Windows XP/7的时代,多媒体文件的转换操作常常面临格式不兼容的问题。这时一款名为格式工厂的软件成为了众多用户的首选工具。格式工厂以其简洁易用的界面和强大的功能,轻松地进行各种文件格式的转换。成为很多修小伙伴的喜爱…...
JavaScript 进阶A(作用域、闭包、变量和函数提升、函数相关只是、数组解构、对象解构、构造函数
1.作用域 作用域主要分为:局部作用域和全局作用域。 局部作用域又分为:函数作用域和块作用域 函数作用域:在函数中定义的变量只能在函数内部使用,外部无法访问块作用域:被大括号{}包起来的代码块,在这个…...
《深度剖析:特征工程—机器学习的隐秘基石》
在机器学习的宏大版图中,特征工程宛如一座隐藏在幕后却又至关重要的基石。它默默发挥着作用,将原始数据雕琢成模型能够有效学习和理解的形态,深刻影响着机器学习模型的性能与表现。 特征工程:机器学习的关键前奏 特征工程是运用…...
Python Tornado 框架面试题及参考答案
目录 Tornado 框架的核心组件是什么?解释其作用。 Tornado 与其他 Python 框架(如 Django、Flask)的主要区别是什么? 为什么 Tornado 适合高并发场景?其设计哲学是什么? 解释 Tornado 的 Application 类和 RequestHandler 类的关系。 如何在 Tornado 中配置静态文件路…...
【音视频】VLC播放器
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 一、vlc是什么? VLC Media Player(简称VLC)是一款免费、开源、跨平台的多媒体播放器,由非营利组织VideoLAN开发,最…...
视觉图像坐标转换
1. 透镜成像 相机的镜头系统将三维场景中的光线聚焦到一个平面(即传感器)。这个过程可以用小孔成像模型来近似描述,尽管实际相机使用复杂的透镜系统来减少畸变和提高成像质量。 小孔成像模型: 假设有一个理想的小孔,…...
算法刷题-2025年03月01日
import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class test_02_28 {//长度最小的子数组 找出总和大于等于target的长度最小的子数组//target 7, nums [2,3,1,2,4,3] [1.2.2.3.3.4]public static int test1(int[] nums, int target){//存…...
算法1-2 分数线划定
题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的 150% 划定,即如果计划录取 m 名志愿者…...
设计模式之责任链模式
引言 在职场中,请假流程大家都再熟悉不过:申请 1 至 2 天的假期,只需直属主管审批即可;若要请假 3 至 5 天,就需部门负责人进行复核;而超过 5 天的假期申请,则必须由总经理最终定夺。要是遇到超…...
AndroidStudio下载旧版本方法
首先,打开Android Studio的官网:https://developer.android.com/studio。 然后,点击【Read release notes】。 然后需要将语言切换成英文,否则会刷不出来。 然后就可以看下各个历史版本了。 直接点链接好像也行:h…...
Excel基础(详细篇):总结易忽视的知识点,有用的细节操作
目录 基础篇Excel主要功能必会快捷键LotusExcel的文件类型工作表基本操作表项操作选中与缩放边框线 自动添加边框线格式刷设置斜线表头双/多斜线表头不变形的:双/多斜线表头插入多行、多列单元格/行列的移动冻结窗口 方便查看数据打印的常见问题Excel格式数字格式日期格式文本…...
FPGA开发,使用Deepseek V3还是R1(7):以“FPGA的整体设计框架”为例
以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…...
Android15 Camera HAL Android.bp中引用Android.mk编译的libB.so
背景描述 Android15 Camera HAL使用Android.bp脚本来构建系统。假设Camera HAL中引用了另外一个HAL实现的so (例如VPU HAL), 恰巧被引用的这个VPU HAL so是用Android.mk构建的,那Camera HAL Android.bp在直接引用这个Android.mk编…...
服务流程设计和服务或端口重定向及其websocket等应用示例
服务流程设计和服务或端口重定向及其websocket等应用示例 目录 服务或端口重定向的服务设计和websocket等应用示例 一、通用请求控制流程 1.1、入口 1.2、所有GET请求首先预检控制单元 1.3、http请求会分别自动307重定向 1.4、所有请求首先执行跨源控制单元 1.5、然后…...
(十 五)趣学设计模式 之 命令模式!
目录 一、 啥是命令模式?二、 为什么要用命令模式?三、 策略模式的实现方式四、 命令模式的优缺点五、 命令模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…...
计算机毕设JAVA——某高校宿舍管理系统(基于SpringBoot+Vue前后端分离的项目)
文章目录 概要项目演示图片系统架构技术运行环境系统功能简介 概要 网络上许多计算机毕设项目开发前端界面设计复杂、不美观,而且功能结构十分单一,存在很多雷同的项目:不同的项目基本上就是套用固定模板,换个颜色、改个文字&…...
点云配准技术的演进与前沿探索:从传统算法到深度学习融合(3)
3、基于深度学习的点云配准方法 3.1 深度学习在点云配准中的应用原理 深度学习作为一种强大的机器学习技术,近年来在点云配准领域展现出了巨大的潜力和优势。其核心在于通过构建复杂的神经网络模型,能够自动从大量的点云数据中学习到高度抽象且有效的特…...
MyBatis TypeHandler 详解与实战:FastJson 实现字符串转 List
在 MyBatis 中,TypeHandler 是实现 Java 类型与数据库类型双向转换 的核心组件。无论是处理基础数据类型还是复杂的 JSON、枚举或自定义对象,它都能通过灵活的扩展机制满足开发需求。本文将通过一个 将数据库 JSON 字符串转换为 List<User> 的案例…...
实验环境搭建集锦(docker linux ros2+强化学习环境+linux上单片机串口调试)
为了记住一些实验环境配置开的文章,边配置边记,免得之后忘了。 Docker环境搭建 yay -S docker //下载docker docker info //查看docker配置 sudo systemctl start docker //系统配置打开docker sudo systemctl enable docker //系统配置后台开启d…...
第十三届蓝桥杯大赛软件赛决赛C/C++ 大学 B 组
A 【2022——暴力DP / 优雅背包】-CSDN博客 B 【钟表——类日期问题】-CSDN博客 C 【卡牌——二分】-CSDN博客 D 【最大数字——DFS】-CSDN博客 E 【出差——Dijkstra】-CSDN博客 F 【费用报销——01背包】-CSDN博客 G 【故障——条件概率】-CSDN博客 H 【机房—…...
商城系统单商户开源版源码
环境配置 1.软件安装 宝塔安装系统软件:Nginx、MySQL5.6、PHP( PHP用7.1-7.4版本)、phpMyAdmin(Web端MySQL管理工具)。 2.配置mysql 设置mysql,在已安装的软件里面找到 mysql点击进行设置 3.修改sql-mode 选择左侧配置修改,找到里面的sql-mode&…...
【SpringBoot+Vue】博客项目开发二:用户登录注册模块
后端用户模块开发 制定参数交互约束 当前,我们使用MybatisX工具快速生成的代码中,包含了一个实体类,这个类中包含我们数据表中的所有字段。 但因为有些字段,是不应该返回到前端的,比如用户密码,或者前端传…...
HTTP 协议的发展历程:从 HTTP/1.0 到 HTTP/2.0
HTTP 协议的发展历程:从 HTTP/1.0 到 HTTP/2.0 HTTP(HyperText Transfer Protocol,超文本传输协议)是 Web 的基础协议,用于客户端和服务器之间的通信。从 HTTP/1.0 到 HTTP/2.0,HTTP 协议经历了多次重大改…...
每日十个计算机专有名词 (7)
Metasploit 词源:Meta(超越,超出) exploit(漏洞利用) Metasploit 是一个安全测试框架,用来帮助安全专家(也叫渗透测试人员)发现和利用计算机系统中的漏洞。你可以把它想…...
SQL经典题型
查询不在表里的数据,一张学生表,一张学生的选课表,要求查出没有选课的学生? select students.student_name from students left join course_selection on students.student_idcourse_selection.student_id where course_selecti…...
基于Linux系统的物联网智能终端
背景 产品研发和项目研发有什么区别?一个令人发指的问题,刚开始工作时项目开发居多,认为项目开发和产品开发区别不大,待后来随着自身能力的提升,逐步感到要开发一个好产品还是比较难的,我认为项目开发的目的…...
文字描边实现内黄外绿效果
网页使用 <!DOCTYPE html> <html> <head> <style> .text-effect {color: #ffd700; /* 黄色文字 */-webkit-text-stroke: 2px #008000; /* 绿色描边(兼容Webkit内核) */text-stroke: 2px #008000; /* 标准语法 *…...
next实现原理
Next.js 是一个基于 React 的 服务器端渲染(SSR) 和 静态生成(SSG) 框架,它的实现原理涉及多个关键技术点,包括 服务端渲染(SSR)、静态生成(SSG)、客户端渲染…...
什么是 jQuery
一、jQuery 基础入门 (一)什么是 jQuery jQuery 本质上是一个快速、小巧且功能丰富的 JavaScript 库。它将 JavaScript 中常用的功能代码进行了封装,为开发者提供了一套简洁、高效的 API,涵盖了 HTML 文档遍历与操作、事件处理、…...
014 rocketmq角色介绍
文章目录 NameServer1 服务发现机制2 为什么要使⽤NameServer3 NameServer如何保证数据的最终⼀致?4 特点 BrokerProducerConsumerTopicQueueProducer GroupConsumer GroupMessageTagOffset 同一消费者组下,队列只能由一个消费者消费 广播模式࿱…...
如何防止Python网络爬虫爬取网站内容
要防止Python网络爬虫爬取网站内容,可以从以下几个方面入手: 遵守Robots.txt文件:首先,网站管理员可以通过robots.txt文件明确告知爬虫哪些页面可以抓取,哪些不可以。爬虫在抓取之前应先检查该文件,尊重网站…...
项目准备(flask+pyhon+MachineLearning)- 3
目录 1.商品信息 2. 商品销售预测 2.1 机器学习 2.2 预测功能 3. 模型评估 1.商品信息 app.route(/products) def products():"""商品分析页面"""data load_data()# 计算当前期间和上期间current_period data[data[成交时间] > data[成…...
选开源CMS建站系统时,插件越多越好吗?
在选择开源CMS建站系统时,插件数量并不是唯一的衡量标准,更不能简单地说“插件越多就越好”,还是需要综合评估来考虑选择结果,以下是有关选择开源CMS系统时对插件数量的考量。 插件数量的优势插件数量可能带来的问题功能丰富性&a…...
OSPF BIT 类型说明
注:本文为 “OSPF BIT 类型 | LSA 类型 ” 相关文章合辑。 机翻,未校。 15 OSPF BIT Types Explained 15 种 OSPF BIT 类型说明 Rashmi Bhardwaj Distribution of routing information within a single autonomous system in larger networks is per…...
C语言(3)—循环、数组、函数的详解
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、函数二、循环与数组 1.循环2.数组 总结 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、函数 在C语言中,函数…...
大唐杯——阶段二01
03 5G寻呼 UE(User Equipment) UE是用户设备(User Equipment)的缩写,指的是移动通信网络中的终端设备,例如手机、平板电脑、物联网传感器等。 AMF(Access and Mobility Management Function&a…...
清华大学Deepseek第六版AIGC发展研究3.0(共186页,附PDF下载)
人工智能生成内容(AIGC)正以前所未有的速度改变我们的生活。 2024年底,清华大学新闻与传播学院与人工智能学院联合发布了《AIGC发展研究3.0版》,这份报告系统梳理了AIGC技术的突破性进展、应用场景及社会影响,并展望了…...
【漫话机器学习系列】114.逻辑 Sigmoid 函数
逻辑 Sigmoid 函数详解 1. 引言 逻辑回归(Logistic Regression)是机器学习中常用的分类算法,而 Sigmoid 函数 是逻辑回归的核心数学工具。Sigmoid 函数能够将任意实数映射到 (0,1) 之间,因此特别适用于概率估计。在这篇文章中&a…...
Cocos Creator3.8.6拖拽物体的几种方式
文章目录 前言一、第一种通过UILocation二、第二种通过UIDelta实现总结 前言 在游戏开发中,拖拽物体是一个非常常见的交互功能,无论是用于UI元素的拖动,还是场景中物体的移动,拖拽操作都能极大地提升用户体验。Cocos Creator 3.8…...
01_NLP基础之文本处理的基本方法
自然语言处理入门 自然语言处理(Natural Language Processing, 简称NLP)是计算机科学与语言学中关注于计算机与人类语言间转换的领域,主要目标是让机器能够理解和生成自然语言,这样人们可以通过语言与计算机进行更自然的互动。 …...
Minio搭建并在SpringBoot中使用完成用户头像的上传
Minio使用搭建并上传用户头像到服务器操作,学习笔记 Minio介绍 minio官网 MinIO是一个开源的分布式对象存储服务器,支持S3协议并且可以在多节点上实现数据的高可用和容错。它采用Go语言开发,拥有轻量级、高性能、易部署等特点,并且可以自由…...
深入解析 Kubernetes CRD:原理、特点与典型应用场景
深入解析 Kubernetes CRD:原理、特点与典型应用场景 一、CRD 的本质与原理 1.1 什么是 CRD? CRD(Custom Resource Definition) 是 Kubernetes 提供的核心扩展机制,允许用户自定义 API 资源类型。通过 CRD,开发者可以将业务逻辑抽象为 Kubernetes 原生资源模型,实现与…...