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

Nginx - 整合lua 实现对POST请求的参数拦截校验(不使用Openresty)

文章目录

  • 概述
  • 步骤 1: 安装 Nginx 和 Lua 模块
  • 步骤 2: 创建 Lua 脚本用于参数校验
  • 步骤 3: 配置 Nginx 使用 Lua 脚本
    • 写法二: 状态码
    • 写法三 : 返回自定义JSON
    • 复杂的正则校验
  • 步骤 4: 测试和验证
  • ngx.HTTP_* 枚举值

在这里插入图片描述


概述

一个不使用 OpenResty 的 Nginx 集成 Lua 脚本的方案,用于对 POST 请求参数进行校验。

在这里插入图片描述

指令所处处理阶段使用范围解释
init_by_lua / init_by_lua_fileloading-confighttpNginx Master进程加载配置时执行;通常用于初始化全局配置/预加载Lua模块
init_worker_by_lua / init_worker_by_lua_filestarting-workerhttp每个Nginx Worker进程启动时调用的计时器,如果Master进程不允许则只会在init_by_lua之后调用;通常用于定时拉取配置/数据,或者后端服务的健康检查
set_by_lua / set_by_lua_filerewriteserver, server if, location, location if设置Nginx变量,可以实现复杂的赋值逻辑;此处是阻塞的,Lua代码要做到非常快。
rewrite_by_lua / rewrite_by_lua_filerewritehttp, server, location, location ifrewrite阶段处理,可以实现复杂的转发/重定向逻辑。
access_by_lua / access_by_lua_fileaccesshttp, server, location, location if请求访问阶段处理,用于访问控制。
content_by_lua / content_by_lua_filecontentlocation, location if内容处理器,接收请求处理并输出响应。
header_filter_by_lua / header_filter_by_lua_fileoutput-header-filterhttp, server, location, location if设置header和cookie。
body_filter_by_lua / body_filter_by_lua_fileoutput-body-filterhttp, server, location, location if对响应数据进行过滤,比如截断、替换。
log_by_lua / log_by_lua_fileloghttp, server, location, location iflog阶段处理,比如记录访问量/统计平均响应时间。

步骤 1: 安装 Nginx 和 Lua 模块

玩转 Nginx 之:使用 Lua 扩展 Nginx 功能

在这里插入图片描述


步骤 2: 创建 Lua 脚本用于参数校验

创建一个 Lua 脚本,位于 /opt/nginx/lib/lua/validate_params.lua(路径根据nginx.conf中的位置调整):

 -- validate_params.lua
local function validate_post_params()ngx.req.read_body()local args = ngx.req.get_post_args()if not args.username or #args.username < 3 thenngx.status = ngx.HTTP_BAD_REQUESTngx.say("Username must be at least 3 characters long")return falseendif not args.password or #args.password < 6 thenngx.status = ngx.HTTP_BAD_REQUESTngx.say("Password must be at least 6 characters long")return falseendreturn true
endreturn {validate_post_params = validate_post_params
}

步骤 3: 配置 Nginx 使用 Lua 脚本

在 Nginx 配置文件中,使用 Lua 脚本来校验 POST 请求参数。修改 nginx.conf` ,增加 Lua 配置:

 
user  root;
worker_processes  1;#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;lua_package_path "/opt/nginx/lib/lua/?.lua;;";lua_need_request_body on;  # 启用请求体读取log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  logs/access.log  main;error_log  logs/error.log ;sendfile        on;keepalive_timeout  65;server {listen       28443;server_name  localhost;access_log  logs/host.access.log  main;location / {root   html;index  index.html index.htm;}location /api {content_by_lua_block {local validator = require("validate_params")if validator.validate_post_params() thenngx.say("Validation passed")end}}}
}

写法二: 状态码

lua

-- validate_params.lua
local function validate_post_params()ngx.req.read_body()local args = ngx.req.get_post_args()-- 验证用户名if not args.username or #args.username < 3 thenreturn ngx.HTTP_BAD_REQUEST, "Invalid username"end-- 验证密码if not args.password or #args.password < 6 thenreturn ngx.HTTP_BAD_REQUEST, "Invalid password"end-- 验证通过return ngx.HTTP_OK, "Validation successful"
endreturn {validate = validate_post_params
}

nginx.conf location config

  location /api {content_by_lua_block {local validator = require("validate_params")local status, message = validator.validate()ngx.status = statusngx.say(status)ngx.say(message)if status ~= ngx.HTTP_OK thenngx.exit(status)end-- 继续后续业务逻辑}}

在这里插入图片描述


写法三 : 返回自定义JSON

如果不使用 cjson 库,我们可以手动构造 JSON 字符串。这种方法虽然不如使用专门的 JSON 库灵活,但对于简单的情况来说是足够的。

 -- validate_params.lua
local function validate_post_params()ngx.req.read_body()local args = ngx.req.get_post_args()if not args.username or #args.username < 3 thenngx.status = ngx.HTTP_BAD_REQUESTngx.say("Username must be at least 3 characters long")return falseendif not args.password or #args.password < 6 thenngx.status = ngx.HTTP_BAD_REQUEST-- 创建 JSON 字符串local json_response = string.format('{"status":"%s","message":"%s"}',ngx.status,  "Password must be at least 6 characters long")-- 设置响应头为 JSONngx.header.content_type = "application/json"-- 输出 JSON 响应ngx.say(json_response)return falseendreturn true
endreturn {validate_post_params = validate_post_params
}

这段代码会返回相同格式的 JSON:

{"status": "400","message": "Password must be at least 6 characters long"
}

在这里插入图片描述

几点说明:

  1. 使用 Lua 的 string.format() 函数来构造 JSON 字符串。这种方法适用于简单的 JSON 结构。

  2. 注意要正确处理字符串中的特殊字符,特别是引号。在这个例子中,我们的消息没有特殊字符,但在实际应用中可能需要进行转义。

  3. 仍然设置响应头的 content-type 为 “application/json”。

  4. 使用 ngx.say() 输出构造的 JSON 字符串。

这种方法的优点是不依赖额外的库,缺点是对于复杂的 JSON 结构可能会变得难以维护。如果需要处理更复杂的 JSON 数据,或者需要频繁地进行 JSON 操作,最好还是使用专门的 JSON 库(如 cjson 或 dkjson)。


 location /api {content_by_lua_block {local validator = require("validate_params")if validator.validate_post_params() thenngx.say("Validation passed")end}}

复杂的正则校验

-- validate_params.lua-- 用户名验证函数
local function validate_username(username)-- 基础检查if not username or username == "" thenreturn false, "Username cannot be empty"end-- 长度检查local length = string.len(username)if length < 3 thenreturn false, "Username is too short (minimum 3 characters)"endif length > 20 thenreturn false, "Username is too long (maximum 20 characters)"end-- 检查是否包含空格if string.find(username, "%s") thenreturn false, "Username cannot contain spaces"end-- 正则表达式检查(只允许字母、数字、下划线,必须以字母开头)local pattern = "^[A-Za-z][A-Za-z0-9_]*$"if not ngx.re.match(username, pattern) thenreturn false, "Username must start with a letter and can only contain letters, numbers and underscore"end-- 检查保留字local reserved_words = {"admin", "root", "system", "user","moderator", "administrator"}local username_lower = string.lower(username)for _, word in ipairs(reserved_words) doif username_lower == word thenreturn false, "This username is reserved"endendreturn true, nil
end-- JSON响应函数
local function send_json_response(status, message)ngx.status = statusngx.header.content_type = "application/json"local json_response = string.format('{"status":"%s","message":"%s"}', status, message)ngx.say(json_response)
end-- 主验证函数
local function validate_post_params()ngx.req.read_body()local args = ngx.req.get_post_args()-- 验证用户名if not args.username thensend_json_response(ngx.HTTP_BAD_REQUEST, "Username is required")return falseendlocal is_valid, error_message = validate_username(args.username)if not is_valid thensend_json_response(ngx.HTTP_BAD_REQUEST, error_message)return falseend-- 验证密码if not args.password or #args.password < 6 thensend_json_response(ngx.HTTP_BAD_REQUEST, "Password must be at least 6 characters long")return falseendreturn true
end-- 导出模块
return {validate_post_params = validate_post_params
}
location /api {content_by_lua_block {local validator = require("validate_params")if validator.validate_post_params() thenngx.say("Validation passed")end}}

在这里插入图片描述

  1. 有效的用户名和密码:
curl -X POST http://localhost:28443/api -d "username=validuser&password=validpass123"

预期结果:成功(具体响应取决于你的成功处理逻辑)

  1. 用户名太短:
curl -X POST http://localhost:28443/api -d "username=ab&password=validpass123"

预期结果:

{"status":"400","message":"Username is too short (minimum 3 characters)"}
  1. 用户名太长:
curl -X POST http://localhost:28443/api -d "username=thisusernameiswaytoolong&password=validpass123"

预期结果:

{"status":"400","message":"Username is too long (maximum 20 characters)"}
  1. 用户名包含空格:
curl -X POST http://localhost:28443/api -d "username=invalid user&password=validpass123"

预期结果:

{"status":"400","message":"Username cannot contain spaces"}
  1. 用户名不以字母开头:
curl -X POST http://localhost:28443/api -d "username=1invaliduser&password=validpass123"

预期结果:

{"status":"400","message":"Username must start with a letter and can only contain letters, numbers and underscore"}
  1. 用户名包含非法字符:
curl -X POST http://localhost:28443/api -d "username=invalid@user&password=validpass123"

预期结果:

{"status":"400","message":"Username must start with a letter and can only contain letters, numbers and underscore"}
  1. 用户名是保留字:
curl -X POST http://localhost:28443/api -d "username=admin&password=validpass123"

预期结果:

{"status":"400","message":"This username is reserved"}
  1. 密码太短:
curl -X POST http://localhost:28443/api -d "username=validuser&password=short"

预期结果:

{"status":"400","message":"Password must be at least 6 characters long"}
  1. 缺少用户名:
curl -X POST http://localhost:28443/api -d "password=validpass123"

预期结果:

{"status":"400","message":"Username is required"}
  1. 缺少密码:
curl -X POST http://localhost:28443/api -d "username=validuser"

预期结果:

{"status":"400","message":"Password must be at least 6 characters long"}

步骤 4: 测试和验证

  1. 重启 Nginx

    sudo systemctl restart nginx
    
  2. 发送 POST 请求
    可以使用 curl 或 Postman 测试:

[root@hcss-ecs-917b sbin]#    curl -X POST http://localhost:28443/api -d "username=test&password=123456"
Validation passed
[root@hcss-ecs-917b sbin]#
[root@hcss-ecs-917b sbin]#
[root@hcss-ecs-917b sbin]#
[root@hcss-ecs-917b sbin]#    curl -X POST http://localhost:28443/api -d "username=test&password=1"
Password must be at least 6 characters long
[root@hcss-ecs-917b sbin]#
[root@hcss-ecs-917b sbin]#
[root@hcss-ecs-917b sbin]#
[root@hcss-ecs-917b sbin]#    curl -X POST http://localhost:28443/api -d "username=t&password=1"
Username must be at least 3 characters long
[root@hcss-ecs-917b sbin]#
[root@hcss-ecs-917b sbin]#
[root@hcss-ecs-917b sbin]#
[root@hcss-ecs-917b sbin]#
[root@hcss-ecs-917b sbin]#
[root@hcss-ecs-917b sbin]#    curl -X POST http://localhost:28443/api
Username must be at least 3 characters long
[root@hcss-ecs-917b sbin]#
[root@hcss-ecs-917b sbin]#

在这里插入图片描述


ngx.HTTP_* 枚举值

在 OpenResty/Nginx 中,ngx.HTTP_* 常用的状态码枚举值如下:

  1. 成功类状态码:
ngx.HTTP_OK                 -- 200 成功
ngx.HTTP_CREATED            -- 201 已创建
ngx.HTTP_NO_CONTENT         -- 204 无内容
  1. 重定向类:
ngx.HTTP_MOVED_TEMPORARILY  -- 302 临时重定向
ngx.HTTP_MOVED_PERMANENTLY  -- 301 永久重定向
ngx.HTTP_SEE_OTHER          -- 303 其他位置
ngx.HTTP_NOT_MODIFIED       -- 304 未修改
  1. 客户端错误类:
ngx.HTTP_BAD_REQUEST        -- 400 错误请求
ngx.HTTP_UNAUTHORIZED       -- 401 未授权
ngx.HTTP_FORBIDDEN          -- 403 禁止访问
ngx.HTTP_NOT_FOUND          -- 404 未找到
ngx.HTTP_METHOD_NOT_ALLOWED -- 405 方法不允许
ngx.HTTP_REQUEST_TIMEOUT    -- 408 请求超时
ngx.HTTP_CONFLICT           -- 409 冲突
ngx.HTTP_GONE               -- 410 资源已不存在
  1. 服务器错误类:
ngx.HTTP_INTERNAL_SERVER_ERROR  -- 500 内部服务器错误
ngx.HTTP_NOT_IMPLEMENTED        -- 501 未实现
ngx.HTTP_BAD_GATEWAY            -- 502 网关错误
ngx.HTTP_SERVICE_UNAVAILABLE    -- 503 服务不可用
ngx.HTTP_GATEWAY_TIMEOUT        -- 504 网关超时

常用示例:

-- 成功响应
ngx.status = ngx.HTTP_OK
ngx.say("Success")-- 参数错误
ngx.status = ngx.HTTP_BAD_REQUEST
ngx.say("Invalid parameters")-- 未授权
ngx.status = ngx.HTTP_UNAUTHORIZED
ngx.say("Authentication required")-- 服务器错误
ngx.status = ngx.HTTP_INTERNAL_SERVER_ERROR
ngx.say("Server error occurred")

推荐使用场景:

  1. 验证类:使用 400-409
  2. 身份认证:使用 401-403
  3. 资源相关:使用 404-410
  4. 服务器错误:使用 500-504

建议根据具体业务场景选择最精准的状态码。

在这里插入图片描述

相关文章:

Nginx - 整合lua 实现对POST请求的参数拦截校验(不使用Openresty)

文章目录 概述步骤 1: 安装 Nginx 和 Lua 模块步骤 2: 创建 Lua 脚本用于参数校验步骤 3: 配置 Nginx 使用 Lua 脚本写法二&#xff1a; 状态码写法三 &#xff1a; 返回自定义JSON复杂的正则校验 步骤 4: 测试和验证ngx.HTTP_* 枚举值 概述 一个不使用 OpenResty 的 Nginx 集…...

互联网直播点播平台EasyDSS无人机视频推拉流技术实现工地远程监控巡检直播

在建筑行业&#xff0c;施工现场的安全管理和实时监控一直是项目管理中的重点。随着技术的进步&#xff0c;无人机工地直播技术成为了一种新兴的解决方案&#xff0c;它不仅能够提高施工透明度&#xff0c;还能够加强现场安全管理。EasyDSS作为一种先进的流媒体技术平台&#x…...

Unity3D 基于GraphView实现的节点编辑器框架详解

前言 在Unity3D游戏开发中&#xff0c;节点编辑器是一种强大的工具&#xff0c;它允许开发者以可视化的方式创建和编辑复杂的逻辑和流程。Unity提供了一个强大的UI工具包——GraphView&#xff0c;它使得创建自定义节点编辑器变得相对简单。本文将详细介绍如何使用GraphView实…...

【C++】开源:Armadillo数值计算库配置与使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Armadillo数值计算库配置与使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 文章目录 :smirk:1. Armadillo介绍:blush:2. 环境配置:s…...

HackMyVM-Airbind靶机的测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Getshell 3、提权 使用ipv6绕过iptables 四、结论 一、测试环境 1、系统环境 渗透机&#xff1a;kali2021.1(192.168.101.127) 靶 机&#xff1a;debian(192.168.101.11…...

C语言----函数

目录 1. 定义&#xff1a; 2.三要素 3.格式 4. 函数声明 5. 函数调用 6.函数传参 6.1. 值传递 6.2. 地址传递 6.3. 数组传递 string函数族 1.strcpy 2. strlen 3. strcat 4.strcmp 递归函数 1. 定义&#xff1a; 一个完成特定功能的代码模块 2.三要素 功能、…...

MySQL图形化界面工具--DataGrip

之前介绍了在命令行进行操作&#xff0c;但是不够直观&#xff0c;本次介绍图形化界面工具–DataGrip。 安装DataGrip 官网链接&#xff1a;官网下载链接 常规的软件安装流程。 参考链接&#xff1a;DataGrip安装 使用DataGrip 添加数据源&#xff1a; 第一次使用最下面会…...

PyTorch AMP 混合精度中grad_scaler.py的scale函数解析

PyTorch AMP 混合精度中的 scale 函数解析 混合精度训练&#xff08;AMP, Automatic Mixed Precision&#xff09;是深度学习中常用的技术&#xff0c;用于提升训练效率并减少显存占用。在 PyTorch 的 AMP 模块中&#xff0c;GradScaler 类负责动态调整和管理损失缩放因子&…...

【Ubuntu20.04】Apollo10.0 Docker容器部署+常见错误解决

官方参考文档【点击我】 Apollo 10.0 版本开始&#xff0c;支持本机和Docker容器两种部署方式。 如果您使用本机部署方式&#xff0c;建议使用x86_64架构的Ubuntu 22.04操作系统或者aarch64架构的Ubuntu 20.04操作系统。 如果您使用Docker容器部署方式&#xff0c;可以使用x…...

【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(二)

****非斜体正文为原文献内容&#xff08;也包含笔者的补充&#xff09;&#xff0c;灰色块中是对文章细节的进一步详细解释&#xff01; 3.1.2 基于注意力的解释&#xff08;Attention-Based Explanation&#xff09; 注意力机制可以揭示输入数据中各个部分之间的关系&#…...

朱姆沃尔特隐身战舰:从失败到威慑

前言 "朱姆沃尔特"号驱逐舰是美国海军雄心勃勃的项目&#xff0c;旨在重塑未来海战。它融合了隐身、自动化和强大火力&#xff0c;然而由于技术问题和预算超支&#xff0c;原计划建造32艘的目标被大幅缩减&#xff0c;最终只建造了三艘。该舰的设计特点包括“穿浪逆船…...

免费分享 | 基于极光优化算法PLO优化宽度学习BLS实现光伏数据预测算法研究附Matlab代码

研究内容 宽度学习系统&#xff08;BLS&#xff09;简介&#xff1a; BLS是一种新型的神经网络结构&#xff0c;由增强节点&#xff08;Enhancement Nodes, ENs&#xff09;和特征节点&#xff08;Feature Nodes, FNs&#xff09;组成&#xff0c;具有结构简单、训练速度快、泛…...

logback日志文件多环境配置路径

项目中遇到问题&#xff0c;springboot项目 本地jar包部署到现场后&#xff0c;经常遇到现场的日志存放的路径会更改&#xff0c;经过查阅&#xff0c;有两种方式&#xff0c;下面简单说明一下。 一、第一种 启动jar包时 添加参数 --logging.configF:\hgtest\config\logback.x…...

面试高频:一致性hash算法

这两天看到技术群里&#xff0c;有小伙伴在讨论一致性hash算法的问题&#xff0c;正愁没啥写的题目就来了&#xff0c;那就简单介绍下它的原理。下边我们以分布式缓存中经典场景举例&#xff0c;面试中也是经常提及的一些话题&#xff0c;看看什么是一致性hash算法以及它有那些…...

docker部署项目

docker部署项目 &#xff08;加载tar包&#xff1a;docker image load -i mysql.tar&#xff09; 一、jdk环境配置 1.jdk下载地址 --Java Archive | Oracle 中国 --选择好版本进入 --下载Linux x64 Compressed Archive的链接 2.解压 --创建文件夹&#xff1a;mkdir /ro…...

每天40分玩转Django:Django Celery

Django Celery 一、知识要点概览表 模块知识点掌握程度要求Celery基础配置、任务定义、任务执行深入理解异步任务任务状态、结果存储、错误处理熟练应用周期任务定时任务、Crontab、任务调度熟练应用监控管理Flower、任务监控、性能优化理解应用 二、基础配置实现 1. 安装和…...

df.groupby(pd.Grouper(level=1)).sum()

df.groupby(pd.Grouper(level1)).sum() 在 Python 中的作用是根据 DataFrame 的某一索引级别进行分组&#xff0c;并计算每个分组的总和。具体来说&#xff1a; df.groupby(...)&#xff1a;这是 pandas 的分组操作&#xff0c;按照指定的规则将 DataFrame 分组。 pd.Grouper(…...

运动控制探针功能详细介绍(CODESYS+SV63N伺服)

汇川AM400PLC和禾川X3E伺服EtherCAT通信 汇川AM400PLC和禾川X3E伺服EtherCAT通信_汇川ethercat通信-CSDN博客文章浏览阅读1.2k次。本文详细介绍了如何使用汇川AM400PLC通过EtherCAT总线与禾川X3E伺服进行通信。包括XML硬件描述文件的下载与安装,EtherCAT总线的启用,从站添加…...

C语言基础18(GDB调试)

文章目录 GDBGDB概述什么是GDB**GDB**的主要功能 GDB的启动GDB常见的启动方式 GDB的退出GDB的常用命令GDB查看源代码指令———list(1)**GDB** 查看设置**------info****GDB** 查看内存**GDB** 设置断点**---break (b)****GDB** 设置观察点**---watch****GDB** 程序调试 GDB完整…...

《向量数据库指南》——应对ElasticSearch挑战,拥抱Mlivus Cloud的新时代

在当今数据驱动的商业环境中,向量数据库的应用正变得愈加重要。随着人工智能和机器学习的快速发展,尤其是在自然语言处理、图像识别及推荐系统等领域,向量数据库以其强大的存储和检索能力,迎来了广泛的应用机会。然而,在实际应用中,企业在选择和实施向量数据库方案时,常…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

6.计算机网络核心知识点精要手册

计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法&#xff1a;数据与控制信息的结构或格式&#xff0c;如同语言中的语法规则语义&#xff1a;控制信息的具体含义和响应方式&#xff0c;规定通信双方"说什么"同步&#xff1a;事件执行的顺序与时序…...