javaguru/nexus-backend
GitHub: javaguru/nexus-backend
一个基于 Java 和 Spring Boot 的 API 网关与 NLP 驱动威胁检测系统,提供 AI WAF 与流量防护能力。
Stars: 0 | Forks: 1
# Nexus-Backend 服务
## 🛡️ 先进的 API 网关与 NLP 驱动的威胁检测
**Nexus-Backend 服务**充当 REST 客户端与后端服务之间的高安全反向代理和中间网关。
它拦截、分析和安全转发 HTTP 请求,同时提供企业级防护以抵御现代 Web 漏洞。
Nexus-Backend 的核心是一个下一代 **AI WAF 引擎**。它不再依赖静态正则表达式规则,而是利用量化后的机器学习模型(DistilBERT)来理解流量的 *语义*。
**关键安全特性:**
* **深度负载检查:** 对 HTTP 标头、URL 参数和大型 JSON 体进行实时语义分析。
* **滑动窗口分块:** 通过数学重叠和提前退出架构安全处理无限 JSON 负载。
* **零日与规避免疫:** 免疫空间偏差、复杂混淆和新型语法注入。
* **高性能:** 完全通过 JNI/ONNX(C++)在 Servlet 容器内本地运行,提供亚 50 毫秒推理时间并具备严格的本机内存追踪。
Nexus 确保只有经过净化、完全安全的流量才能到达您的后端 REST API。
**支持所有 HttpRequests 方法:** Get、Post、Post Multipart File、Put、Put Multipart File、Patch、Patch Multipart File、Delete。
* 完整支持 **Request JSON Entity Object**:application/json、application/x-www-form-urlencoded
* 完整支持 **MultipartRequest 资源与 Map 参数**,以及嵌入的表单 **Json Entity Object**:multipart/form-data
* 完整支持 **Response in JSON Entity Object**:application/json
* 完整支持 **Response in ByteArray Resource file**:application/octet-stream
* 完整支持 **Streaming Http Response JSON Entity Object**:application/octet-stream、accept header Range bytes
* 完整支持 **Cookie 管理**,在重定向 Http 状态 3xx 期间
**Tomcat Servlet 容器(Servlet 版本 6.x)**
**通过 Nexus-Backend 服务转发的请求与响应示例:**
| REST 客户端 | RestApi Nexus-Backend 服务 | 后端服务器服务 |
|----------------------|:---------------------------------------------------|:----------------------------------------|
| Ajax / XMLHttpRequest | http://localhost:8082/nexus-backend/api/** | https://secure.jservlet.com:9092/api/v1/service |
| HttpClient | https://front.jservlet.com:80/nexus-backend/api/** | https://secure.jservlet.com:9092/api/v1/service |
| FeedService | https://intra.jservlet.com:80/nexus-backend/api/** | https://10.100.100.50:9092/api/v1/service |
***一个 Ajax 单页应用程序通过 RestController ApiBackend 和其 BackendService 与 RestApi 后端服务器进行通信。***
### 能够保护所有 RestApi 请求到后端服务器
* 实现 **BackendService**,支持请求类型化的响应对象类或 ParameterizedTypeReference,可在所有 HTTP 方法上请求 RestApi 后端服务器。
* 实现 **EntityBackend** JSON 对象或资源,传输回标头,管理错误 HttpStatus 400、401、405 或 500(来自后端服务器)。
* 实现 **HttpFirewall** 过滤器防护规避,拒绝任何可疑的请求编码,并记录有故障的 IP 地址。
* 实现 **WAF Filter** 防护在 Http JSON Body 请求、标头、键、参数上的规避,并记录有故障的 IP 地址。
* 实现 **CORS Security Request** 过滤器,基于来源域和方法授权请求。
* 实现 **Content Security Policy** 过滤器,定义您自己的策略规则 CSP。
* 实现 **RateLimit** 拦截器,允许每分钟每 IP 地址 1000 个请求。
* 为每个 Http 请求标头实现 **Fingerprint**,生成可追踪的唯一 Token APP-REQUEST-ID 到访问日志。
* 实现 **HttpMethod Override** 过滤器,PUT 或 PATCH 请求可在 POST 或 DELETE 中切换,并通过标头 X-HTTP-Method-Override。
* 实现 **Forwarded Header** 过滤器,默认设置 removeOnly 为 true,移除 “Forwarded” 和 “X-Forwarded-*” 标头。
* 实现 **FormContent** 过滤器,为 Http PUT、PATCH 和 DELETE 请求解析表单数据,并将其公开为 Servlet 请求参数。
* 实现 **Compressing** 过滤器,对 Http 响应进行 Gzip 压缩。
* 实现 **CharacterEncoding** 过滤器,UTF-8 默认编码用于请求。
### 特殊配置 Http 标头
* **HTTP 标头:** 重置所有标头,移除主机或来源标头。
* **基本身份验证:** 设置任意安全 ACL **访问控制列表**。
* **Bearer 授权:** 设置任意安全 **Bearer 令牌**。
* **Cookie:** 设置任意 **安全会话 Cookie**。
* **CORS:** 本地绕过所有 **CORS 安全**(跨源资源共享),不受限于通过所谓同源策略从同一来源访问资源。
### Nexus 后端应用程序可通过以下键进行配置(SpringBoot 和设置属性)
**SpringBoot 键 application.properties:**
| **键** | **默认值** | **描述** |
|------------------------------------------------|:----------|:-------------------------------------------|
| nexus.api.backend.enabled | true | 激活 Nexus-Backend 服务 |
| nexus.api.backend.filter.waf.enabled | true | 激活 WAF 过滤器 Json 请求体 |
| nexus.api.backend.listener.requestid.enabled | true | 激活每个 Http 请求的指纹识别 |
| nexus.api.backend.filter.httpoverride.enabled | true | 激活 Http 方法覆盖 |
| nexus.api.backend.interceptor.ratelimit.enabled | true | 激活速率限制 |
| nexus.backend.filter.forwardedHeader.enabled | true | 激活 ForwardedHeader 过滤器 |
| nexus.backend.filter.gzip.enabled | true | 激活 Gzip 压缩过滤器 |
| spring.mvc.formcontent.filter.enabled | true | 激活 FormContent 参数映射支持 |
| nexus.backend.tomcat.connector.https.enable | false | 在嵌入式 Tomcat 中激活 TLS/SSL 连接器 |
| nexus.backend.tomcat.accesslog.valve.enable | false | 在嵌入式 Tomcat 中激活访问日志 |
#### 注意 Spring 配置位置可被覆盖
* -Dspring.config.location=/your/config/dir/
* -Dspring.config.name=spring.properties
### Nexus-Backend Url 服务器和杂项选项可通过以下键进行配置(设置)
**设置键 settings.properties:**
| **键** | **默认值** | **示例值** | **描述** |
|-----------------------------------------------|:-----------------|:-------------------------|:---------------------------------------------|
| **nexus.backend.url** | https://postman-echo.com | https://nexus6.jservlet.com/api | API 后端服务器
目标服务器 | | **nexus.backend.uri.alive** | /get | /health/info | 活动端点
后端服务器 | | nexus.backend.http.response.truncated | false | true | 截断 Json
输出到日志 | | nexus.backend.http.response.truncated.maxLength | 1000 | 100 | 最大截断长度 | | **WAF** | | | | | nexus.api.backend.filter.waf.reactive.mode | STRICT_ONNX_AI | ONNX_AI | 默认严格 HttpFirewall + AI 神经网络 | | nexus.api.backend.filter.waf.deepscan.cookie | false | true | 激活深度扫描 Cookie | | **标头** | | | | | nexus.backend.header.remove | **true** | true | 移除所有标头 | | nexus.backend.header.host.remove | false | false | 仅移除主机标头 | | nexus.backend.header.origin.remove | false | false | 仅移除来源标头 | | nexus.backend.header.cookie | - | XSession=0XX1YY2ZZ3XX4YY5ZZ6XX | 设置请求 Cookie 标头 | | nexus.backend.header.bearer | - | eyJhbGciO | 激活 Bearer
授权请求 | | nexus.backend.header.user-agent | JavaNexus | Apache HttpClient/4. | 用户代理标头 | | nexus.backend.header.authorization.username | - | XUsername | 激活基本
授权请求 | | nexus.backend.header.authorization.password | - | XPassword | “ | | **后端标头** | | | | | nexus.api.backend.transfer.headers | test | test,Link,Content-Range | 从后端服务器返回的标头列表 | | **映射器** | | | | | nexus.backend.mapper.indentOutput | false | true | 缩进输出 Json | | **调试** | | | | | nexus.spring.web.security.debug | false | true | 调试 Spring 过滤器链 | **注意**:关于返回标头列表的 HttpHeaders,CORS 可以暴露这些标头,请参见 security.cors.exposedHeaders 键。 #### 注意 settings.properties 可通过配置文件路径 config.properties 覆盖 * **${user.home}**/conf-global/config.properties * **${user.home}**/conf/config.properties * **${user.home}**/cfg/**${servletContextPath}**/config.properties ### Nexus-Backend Url 服务器和杂项选项可通过以下键进行配置(设置) **设置键 settings.properties:** | **键** | **默认值** | **示例值** | **描述** | |-----------------------------------------------|:-----------------|:-------------------------|:---------------------------------------------| | **nexus.backend.url** | https://postman-echo.com | https://nexus6.jservlet.com/api | API 后端服务器
目标服务器 | | **nexus.backend.uri.alive** | /get | /health/info | 活动端点
后端服务器 | | nexus.backend.http.response.truncated | false | true | 截断 Json
输出到日志 | | nexus.backend.http.response.truncated.maxLength | 1000 | 100 | 最大截断长度 | | **WAF** | | | | | nexus.api.backend.filter.waf.reactive.mode | STRICT_ONNX_AI | ONNX_AI | 默认严格 HttpFirewall + AI 神经网络 | | nexus.api.backend.filter.waf.deepscan.cookie | false | true | 激活深度扫描 Cookie | | **标头** | | | | | nexus.backend.header.remove | **true** | true | 移除所有标头 | | nexus.backend.header.host.remove | false | false | 仅移除主机标头 | | nexus.backend.header.origin.remove | false | false | 仅移除来源标头 | | nexus.backend.header.cookie | - | XSession=0XX1YY2ZZ3XX4YY5ZZ6XX | 设置请求 Cookie 标头 | | nexus.backend.header.bearer | - | eyJhbGciO | 激活 Bearer
授权请求 | | nexus.backend.header.user-agent | JavaNexus | Apache HttpClient/4.5 | 用户代理标头 | | nexus.backend.header.authorization.username | - | XUsername | 激活基本
授权请求 | | nexus.backend.header.authorization.password | - | XPassword | “ | | **后端标头** | | | | | nexus.api.backend.transfer.headers | test | test,Link,Content-Range | 从后端服务器返回的标头列表 | | **映射器** | | | | | nexus.backend.mapper.indentOutput | false | true | 缩进输出 Json | | **调试** | | | | | nexus.spring.web.security.debug | false | true | 调试 Spring 过滤器链 | **注意**:关于返回标头列表的 HttpHeaders,CORS 可以暴露这些标头,请参见 security.cors.exposedHeaders 键。 #### 注意 settings.properties 可通过配置文件路径 config.properties 覆盖 * **${user.home}**/conf-global/config.properties * **${user.home}**/conf/config.properties * **${user.home}**/cfg/**${servletContextPath}**/config.properties ### ApiBackend 配置 JSON 实体对象或字节数组资源 **ApiBackend ResponseType** 现在可以是 **字节数组资源**。 **下载** 任何内容作为 **字节数组**,包括通用扩展文件(请参见 **[MediaTypes](#The-MediaTypes-safe-extensions-configuration)** 部分) **ResourceMatchers** 配置可以针对特定的字节数组资源路径 以及特定方法 **GET、POST、PUT、PATCH** 和 Ant 路径模式: **设置键 settings.properties:** | **键 方法** 和 **键 路径模式** | **默认值** | **内容类型** | |-------------------------------------------------------|:-----------------|:---------------------| | nexus.backend.api-backend-resource.matchers.1.method | GET | | | nexus.backend.api-backend-resource.matchers.1.pattern | /api/encoding/** | text/html;charset=utf-8 | | nexus.backend.api-backend-resource.matchers.2.method | GET | | | nexus.backend.api-backend-resource.matchers.2.pattern | /api/streaming/**| application/octet-stream | | nexus.backend.api-backend-resource.matchers.3.method | GET | | | nexus.backend.api-backend-resource.matchers.3.pattern | /api/time/now | text/html;charset=utf-8 | | nexus.backend.api-backend-resource.matchers.{name}[X].method | Methods | | | nexus.backend.api-backend-resource.matchers.{name}[X].pattern | Patterns | | **Http 响应** 被视为 **资源**,HTTP 标头 **"Accept-Ranges: bytes"** 会被注入,允许您使用 HTTP 标头 **'Range: bytes=1-100'** 进行请求,并仅获取所需的字节范围。
并且 Http 响应不会带有 HTTP 标头 **"Transfer-Encoding: chunked"**,因为存在 **Content-Length** 标头。 **注意:** 若要将所有响应配置为 **资源**,请留空方法并使用路径模式=/api/** | **键 方法** 和 **键 路径模式** | **默认值** | |-------------------------------------------------------|:----------| | nexus.backend.api-backend-resource.matchers.matchers1.method | | | nexus.backend.api-backend-resource.matchers.matchers1.pattern | /api/** | **注意 bis:** 若要移除 HTTP 标头 **"Transfer-Encoding: chunked"**,需要计算 **Content-Length** 标头。 在配置中启用 **ShallowEtagHeader Filter**,以强制为所有 **响应 JSON 实体对象** 计算标头 **Content-Length**,不再有 HttpHeader **"Transfer-Encoding: chunked"**。 ### 媒体类型安全扩展配置 **媒体类型安全扩展** Spring ContentNegotiation 会加载可扩展的安全扩展文件。 加载通用 MediaTypes 属性文件 [resources/mime/MediaTypes_commons.properties](https://github.com/javaguru/nexus-backend/blob/master/src/main/resources/mime/MediaTypes_commons.properties) 并可禁用: **设置键 settings.properties:** 默认标头内容协商策略: | **内容协商策略** | **默认值** | **策略描述** | |------------------------------------------------|:----------|:---------------| | **Header Strategy** | | | | nexus.backend.content.negotiation.ignoreAcceptHeader | false | 标头策略已启用 | | **参数策略** | | | | nexus.backend.content.negotiation.favorParameter | false | 参数策略已禁用 | | nexus.backend.content.negotiation.parameterName | mediaType | | | **注册扩展** | | | | nexus.backend.content.negotiation.useRegisteredExtensionsOnly | true | 仅启用注册扩展 | | **加载通用 MediaTypes** | | | | nexus.backend.content.negotiation.commonTypes | true | 已启用 | ### CORS 安全配置 **CORS 安全配置,允许对域和方法进行控制请求** **设置键 settings.properties:** 默认的 Cors 配置: | **Cors 配置** | **默认值** | **示例值** | **描述** | |------------------------------------------|:----------------------------------------------------------------|:--------------------------------------------|:---------------| | nexus.backend.security.cors.credentials | false | true | 启用凭据 | | nexus.backend.security.cors.allowedHttpMethods | GET,POST,PUT
,OPTIONS,HEAD,
DELETE,PATCH | GET,POST,PUT,OPTIONS | 允许的 HTTP 方法列表 | | nexus.backend.security.cors.allowedOriginPatterns | | | 正则表达式域模式 | | nexus.backend.security.cors.allowedOrigins | * | http://localhost:4042,
http://localhost:4083 | 域列表 | | nexus.backend.security.cors.allowedHeaders | Authorization,Cache-Control,
Content-Type,
X-Requested-With,Accept | Authorization,
Cache-Control,
Content-Type | 允许的标头列表 | | nexus.backend.security.cors.exposedHeaders | | Link,X-Custom-Header | 暴露的标头列表 | | nexus.backend.security.cors.maxAge | 3600 | 1800 | 缓存最大时长 | **注意**:如果 credentials 为 true,则 allowedOrigins 不能为通配符 '*',需要提供域列表。 暴露的标头 ### 速率限制配置 **速率限制** 每分钟每 IP 地址 1000 次。 **SpringBoot 键** *nexus.api.backend.interceptor.ratelimit.enabled* 设置为 **true** 以激活速率限制。 **设置键 settings.properties:** 默认的 Cors 配置: | **Cors 配置** | **默认值** | **示例值** | **描述** | |------------------------------------------------|:----------|:----------|:---------| | nexus.backend.interceptor.ratelimit.refillToken | 1000 | 100 | 填充令牌数 | | nexus.backend.interceptor.ratelimit.refillMinutes | 1 | 1 | 持续时间(分钟) | | nexus.backend.interceptor.ratelimit.bandwidthCapacity | 1000 | 100 | 桶容量 | ### Nexus-Backend 完全支持 MultipartRequest 和 Form-data HttpRequest 中的 Map 参数 #### MultipartConfig **SpringBoot 键 application.properties:** | **键** | **默认值** | **示例值** | **描述** | |----------------------------------------------|:----------|:----------|:------------| | spring.servlet.multipart.enabled | true | true | 启用 multipart | | spring.servlet.multipart.file-size-threshold | 2MB | 5MB | 文件大小阈值 | | spring.servlet.multipart.max-file-size | 15MB | 150MB | 最大文件大小 | | spring.servlet.multipart.max-request-size | 15MB | 150MB | 最大请求大小 | **注意**:所有 **Content-Type 为 multipart/form-data** 的 Http 请求都将由临时 **BackendResource** 管理。 ~~此 BackendResource 可以将 **MultipartFile** 转换为临时 **Resource**,准备发送到 **Backend Server**。~~ 从 1.0.24 版本起,不再使用 BackendResource 和临时文件,所有内容均在内存中完成。 ### BackendService HttpFactory 客户端配置 **设置键 settings.properties:** | **键** | **默认值** | **示例值** | **描述** | |-----------------------------------------------------|:----------|:----------|:--------------------------| | nexus.backend.client.header.user-agent | JavaNexus | curl | 用户代理标头 | | nexus.backend.client.connectTimeout | 10 | 5 | 连接超时(秒) | | nexus.backend.client.requestTimeout | 20 | 10 | 请求超时(秒) | | nexus.backend.client.socketTimeout | 10 | 5 | Socket 超时(秒) | | nexus.backend.client.max_connections_per_route | 20 | 30 | 每路由最大连接数 | | nexus.backend.client.max_connections | 100 | 300 | 连接池最大连接数 | | nexus.backend.client.close_idle_connections_timeout | 0 | 0 | 关闭空闲连接超时 | | nexus.backend.client.validate_after_inactivity | 2 | 2 | 非活动后验证 | | nexus.backend.client.retryCount | 3 | 0 | 重试次数 | | nexus.backend.client.redirectsEnabled | true | true | 启用重定向 | | nexus.backend.client.maxRedirects | 5 | 2 | 最大重定向次数 | | nexus.backend.client.authenticationEnabled | false | true | 启用身份验证 | | nexus.backend.client.circularRedirectsAllowed | false | true | 允许循环重定向 | | nexus.backend.client.cookie.domain | | postman-echo.com | Cookie 域或空或 #{null} | | nexus.backend.client.cookie.secure | false | true | 移除安全 Cookie | ### Nexus-Backend 防火墙与 WAF 过滤器配置 **Nexus-Backend** 实现了 **HttpFirewall** 防护以防止规避,并拒绝任何可疑的 Http 请求 在标头、Cookie、参数、键和值上。 **WAF Filter** 实现了针对 **Json Http 请求体** 的安全 WAF 防护以防止规避。 **未标准化** 的 Http 请求会被 **StrictHttpFirewall** 自动拒绝, 并且会移除用于匹配的路径参数和重复斜杠。 **注意**:有效字符在 **RFC 7230** 和 **RFC 3986** 中定义, 由 **Apache Coyote http11 处理器** 检查(请参见 coyote Error parsing HTTP request header)。 所有带有 **Cookie、标头、参数和请求体** 的 Http 请求都将被过滤, 并且有问题的 **IP 地址** 将被记录。 **设置键 settings.properties:** | **键** | **默认值** | **描述** | |------------------------------------------------------------|:------------------------------------|:------------------------------| | nexus.backend.security.allowedHttpMethods | GET,POST,PUT,OPTIONS,
HEAD,DELETE,PATCH | 允许的 HTTP 方法 | | nexus.backend.security.allowSemicolon | false | 允许分号 | | nexus.backend.security.allowUrlEncodedSlash | false | 允许编码斜杠 | | nexus.backend.security.allowUrlEncodedDoubleSlash | false | 允许编码双斜杠 | | nexus.backend.security.allowUrlEncodedPeriod | false | 允许编码点号 | | nexus.backend.security.allowBackSlash | false | 允许反斜杠 | | nexus.backend.security.allowNull | false | 允许空值 | | nexus.backend.security.allowUrlEncodedPercent | false | 允许编码百分号 | | | nexus.backend.security.allowUrlEncodedCarriageReturn | false | 允许编码回车符 | | | nexus.backend.security.allowUrlEncodedLineFeed | false | 允许编码换行符 | | | nexus.backend.security.allowUrlEncodedParagraphSeparator | false | 允许编码段落分隔符 | | | nexus.backend.security.allowUrlEncodedLineSeparator | false | 允许编码行分隔符 | **WAF 实用程序谓词检查潜在规避:** * XSS 脚本注入 * SQL 注入 * Google 注入 * 命令注入 * 文件注入 * 链接注入 **实现用于潜在规避的标头或参数的 WAF 谓词:** * 标头名称 / 标值 * 参数名称 / 参数值 * 主机名 * 用户代理 **并检查基于长度的缓冲区溢出规避:** * 参数名称最大 255 个字符 / 值最大 1000000 个字符 * 标头名称最大 255 个字符 / 值最大 25000 个字符 * 主机名最大 255 个字符 **WAF 反应模式配置:** * **STRICT_ONNX_AI**:严格模式 + 通过 ONNX 神经网络的人工智能扫描 * **ONNX_AI**:通过 ONNX 神经网络的人工智能扫描 * **STRICT**:严格 HttpFirewall + JSON 请求体 * **PASSIVE**:严格 HttpFirewall + 干净的 JSON 请求体和参数映射 * **UNSAFE**:严格 HttpFirewall + 不检查 JSON 请求体! **AI 模型 ONNX 模型/model.onnx** **设置键 settings.properties:**定义模型和分词器文件 | **键** | **默认值** | **描述** | |----------------------------------------------|:-----------------------------|:-----------------| | nexus.api.backend.analyzer.onnx.maxLength | 512 | 最大 Token 长度 | | nexus.api.backend.analyzer.onnx.truncation | false | 截断 | | nexus.api.backend.analyzer.onnx.path.model | model/nexus_v10_14_int8.onnx | AI 模型 ONNX | | nexus.api.backend.analyzer.onnx.path.tokenizer | model/tokenizer.json | 分词器文件 | | nexus.api.backend.analyzer.onnx.cpu | 4 | CPU 数量 | **设置键 settings.properties:**定义标头或参数键/值长度的最大值 | **键** | **默认值** | **描述** | |----------------------------------------------------------|:----------|:------------------------| | nexus.backend.security.predicate.parameterNamesLength | 255 | 参数名称最大长度 | | nexus.backend.security.predicate.parameterValuesLength | 1000000 | 参数值最大长度 | | nexus.backend.security.predicate.headerNamesLength | 255 | 标头名称最大长度 | | nexus.backend.security.predicate.headerNamesValuesLength | 25000 | 标头值最大长度 | | nexus.backend.security.predicate.hostNamesLength | 255 | 主机名称最大长度 | | nexus.backend.security.predicate.hostName.pattern | | 主机名模式过滤器 | | nexus.backend.security.predicate.userAgent.blocked | false | 激活扫描器 UserAgent 过滤器 | | nexus.backend.security.predicate.aiUserAgent.blocked | true | 激活 AI UserAgent 过滤器 | | nexus.backend.security.predicate.aiUserAgent.blocked | true | 激活 AI UserAgent 过滤器 | ### 激活 HttpFactory 客户端的双向身份验证或 mTLS 连接 **设置键 settings.properties:** *nexus.backend.client.ssl.mtls.enable* 设置为 **true** 以激活 mTLS 连接 | **键** | **默认值** | **描述** | |-------------------------------------------|:-----------------|:------------------| | nexus.backend.client.ssl.mtls.enable | **false** | 激活双向 TLS | | nexus.backend.client.ssl.key-store | nexus-default.jks | Java KeyStore 路径 | | nexus.backend.client.ssl.key-store-password | changeit | 密码 | | nexus.backend.client.ssl.certificate.alias | key_server | 证书别名 | | nexus.backend.client.ssl.https.protocols | TLSv1.3 | 协议 | | nexus.backend.client.ssl.https.cipherSuites | TLS_AES_256_GCM_SHA384 | 密码套件 | ### 激活 Tomcat Catalina 连接器 TLS/SSL(通配符域证书) **设置键 settings.properties:** **SpringBoot 键** *nexus.backend.tomcat.connector.https.enable* 设置为 **true** 以激活 TLS/SSL 协议 | **键** | **默认值** | **描述** | |------------------------------------------------------|:--------------|:------------------| | nexus.backend.tomcat.ssl.keystore-path | /home/root/.keystore | Java KeyStore 路径 | | nexus.backend.tomcat.ssl.keystore-password | changeit | 密码 | | nexus.backend.tomcat.ssl.certificate.alias | key_server | 证书别名 | | nexus.backend.tomcat.ssl.https.port | 8443 | Https 端口 | | nexus.backend.tomcat.ssl.ajp.connector.enable | false | 启动 Ajp 连接器 | | nexus.backend.tomcat.ssl.ajp.connector.port | 8009 | Ajp 端口 | | nexus.backend.tomcat.ssl.ajp.connector.protocol | AJP/1.3 | AJP 版本 1.3 | | nexus.backend.tomcat.ssl.ajp.connector.secretRequired | false | 需要密钥 | ### 激活 Tomcat Catalina 扩展访问日志阀 **设置键 settings.properties:** **SpringBoot 键** *nexus.backend.tomcat.accesslog.valve.enable* 设置为 **true** 以激活访问日志 | **键** | **默认值** | **描述** | |--------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------|:----------------| | nexus.backend.tomcat.accesslog.directory | /tmp/logs/tomcat-nexus | 访问日志目录 | | nexus.backend.tomcat.accesslog.suffix | .log | 后缀 | | nexus.backend.tomcat.accesslog.encoding | UTF-8 | 编码 | | nexus.backend.tomcat.accesslog.pattern | date time x-threadname c-ip cs-method cs-uri
sc-status bytes x-H(contentLength)time-taken
x-H(authType) cs(Authorization) cs(User-Agent) | 模式 | | nexus.backend.tomcat.accesslog.checkExists | true | 检查文件是否存在 | | nexus.backend.tomcat.accesslog.asyncSupported | true | 支持异步请求 | | nexus.backend.tomcat.accesslog.renameOnRotate | true | 轮转时重命名 | | nexus.backend.tomcat.accesslog.throwOnFailure | true | 失败时抛出异常 | | nexus.backend.tomcat.accesslog.maxDay | -1 | 文件保留最大天数 | **注意**:完整的访问日志可通过 **CommonsRequestLoggingFilter** 获取,包含 **RequestBody**。 已初始化,通过将 logback.xml 设置为 **level="DEBUG"** 激活。 ## 构建 Nexus-Backend [Java](https://jdk.java.net/archive/) [SpringBoot](https://projects.spring.io/spring-boot/) [Tomcat](https://tomcat.apache.org/download-10.cgi) [Maven](https://maven.apache.org/download.cgi) ### 构建要求 * Java 21 * SpringBoot 3.3.0 * Tomcat 10.0.53 & Servlet 6.0.0(Jakarta) * Maven 3.9.x ### 使用 withoutTomcat 配置文件构建 war(外部 Tomcat 9) * `mvn clean compile -P withoutTomcat` * `mvn clean package -P withoutTomcat` * `mvn clean install -P withoutTomcat` 并查找 `target/nexus-backend-{version}.war` ### 使用 withTomcat 配置文件构建 jar(嵌入式 Tomcat 9) * `mvn clean compile -P withTomcat` * `mvn clean install -P withTomcat` * `mvn clean package -P withTomcat` 并查找 `target/nexus-backend-{version}.jar` ### 获取 Javadoc `mvn javadoc:javadoc` ### 运行 SpringBoot 应用 使用 Maven(-XX:NativeTracking=summary 用于监控 ONNX 神经网络的本机内存跟踪): `mvn spring-boot:run -P withTomcat -Dspring-boot.run.jvmArguments="-Dspring.profiles.active=withTomcat -XX:NativeMemoryTracking=summary"` 使用 Maven 和开发环境: `mvn spring-boot:run -P withTomcat -Dspring-boot.run.jvmArguments="-Denvironment=development -Dspring.profiles.active=withTomcat -XX:NativeMemoryTracking=summary"` ### 配置 默认情况下,它使用 `8082` 端口和 Servlet 上下文 `/nexus-backend`。 默认的 SpringBoot 配置文件位于 `/src/main/resources/application.properties`。 默认的 NexusBackend 配置文件位于 `/src/main/resources/settings.properties`。 配置键和值可以通过外部路径文件覆盖,例如: * 文件 `{user.home}/conf-global/config.properties` * 文件 `{user.home}/conf/config.properties` * 文件 `{user.home}/cfg/nexus-backend/config.properties` ### Swagger 测试环境 请参见 RestControllerTest,它与 MockController 交互,运行测试时使用本地运行在 localhost:8082/nexus-backend 的 Tomcat。 开发模式下,Swagger Mock-Api 可用,需在 JVM 选项中添加:-Denvironment=development ## BackendService API 实现 此 API 实现用于与后端服务器通信。 它为后端侧支持的所有 HTTP 协议提供方法。 通常,它与一个 API 接口 Backend 进行通信。 ### 可用的 HTTP 方法: * Get * Post * Post Multipart File * Put * Put Multipart File * Patch * Patch Multipart File * Delete ### 示例 BackendService API #### 先决条件: * **RestOperations** 应配置为使用 Apache-HttpClient,并正确配置池化连接。 * **HttpMessageConverter** 也是必需的,StringHttp、FormHttp、ByteArrayHttp、ResourceHttp 和 MappingJackson2Http 是最小集。 * **类型化响应** 参数 Class 对象或 ParameterizedTypeReference 是必需的。 * **Object.class** 不能直接转换为 Resource 或 ByteArray,而无需最小的类型化响应支持。 #### 初始化 RestApi BackendService ``` BackendService backendService = new BackendServiceImpl(); backendService.setBackendURL("https://internal.domain.com:9094"); backendService.setRestOperations(new RestTemplate()); backendService.setObjectMapper(new ObjectMapper()); ``` #### 获取数据 ``` Data data = backendService.get("/mock/v1/data", backendService.createResponseType(Data.class)); ``` #### 获取列表数据 ``` ResponseType
目标服务器 | | **nexus.backend.uri.alive** | /get | /health/info | 活动端点
后端服务器 | | nexus.backend.http.response.truncated | false | true | 截断 Json
输出到日志 | | nexus.backend.http.response.truncated.maxLength | 1000 | 100 | 最大截断长度 | | **WAF** | | | | | nexus.api.backend.filter.waf.reactive.mode | STRICT_ONNX_AI | ONNX_AI | 默认严格 HttpFirewall + AI 神经网络 | | nexus.api.backend.filter.waf.deepscan.cookie | false | true | 激活深度扫描 Cookie | | **标头** | | | | | nexus.backend.header.remove | **true** | true | 移除所有标头 | | nexus.backend.header.host.remove | false | false | 仅移除主机标头 | | nexus.backend.header.origin.remove | false | false | 仅移除来源标头 | | nexus.backend.header.cookie | - | XSession=0XX1YY2ZZ3XX4YY5ZZ6XX | 设置请求 Cookie 标头 | | nexus.backend.header.bearer | - | eyJhbGciO | 激活 Bearer
授权请求 | | nexus.backend.header.user-agent | JavaNexus | Apache HttpClient/4. | 用户代理标头 | | nexus.backend.header.authorization.username | - | XUsername | 激活基本
授权请求 | | nexus.backend.header.authorization.password | - | XPassword | “ | | **后端标头** | | | | | nexus.api.backend.transfer.headers | test | test,Link,Content-Range | 从后端服务器返回的标头列表 | | **映射器** | | | | | nexus.backend.mapper.indentOutput | false | true | 缩进输出 Json | | **调试** | | | | | nexus.spring.web.security.debug | false | true | 调试 Spring 过滤器链 | **注意**:关于返回标头列表的 HttpHeaders,CORS 可以暴露这些标头,请参见 security.cors.exposedHeaders 键。 #### 注意 settings.properties 可通过配置文件路径 config.properties 覆盖 * **${user.home}**/conf-global/config.properties * **${user.home}**/conf/config.properties * **${user.home}**/cfg/**${servletContextPath}**/config.properties ### Nexus-Backend Url 服务器和杂项选项可通过以下键进行配置(设置) **设置键 settings.properties:** | **键** | **默认值** | **示例值** | **描述** | |-----------------------------------------------|:-----------------|:-------------------------|:---------------------------------------------| | **nexus.backend.url** | https://postman-echo.com | https://nexus6.jservlet.com/api | API 后端服务器
目标服务器 | | **nexus.backend.uri.alive** | /get | /health/info | 活动端点
后端服务器 | | nexus.backend.http.response.truncated | false | true | 截断 Json
输出到日志 | | nexus.backend.http.response.truncated.maxLength | 1000 | 100 | 最大截断长度 | | **WAF** | | | | | nexus.api.backend.filter.waf.reactive.mode | STRICT_ONNX_AI | ONNX_AI | 默认严格 HttpFirewall + AI 神经网络 | | nexus.api.backend.filter.waf.deepscan.cookie | false | true | 激活深度扫描 Cookie | | **标头** | | | | | nexus.backend.header.remove | **true** | true | 移除所有标头 | | nexus.backend.header.host.remove | false | false | 仅移除主机标头 | | nexus.backend.header.origin.remove | false | false | 仅移除来源标头 | | nexus.backend.header.cookie | - | XSession=0XX1YY2ZZ3XX4YY5ZZ6XX | 设置请求 Cookie 标头 | | nexus.backend.header.bearer | - | eyJhbGciO | 激活 Bearer
授权请求 | | nexus.backend.header.user-agent | JavaNexus | Apache HttpClient/4.5 | 用户代理标头 | | nexus.backend.header.authorization.username | - | XUsername | 激活基本
授权请求 | | nexus.backend.header.authorization.password | - | XPassword | “ | | **后端标头** | | | | | nexus.api.backend.transfer.headers | test | test,Link,Content-Range | 从后端服务器返回的标头列表 | | **映射器** | | | | | nexus.backend.mapper.indentOutput | false | true | 缩进输出 Json | | **调试** | | | | | nexus.spring.web.security.debug | false | true | 调试 Spring 过滤器链 | **注意**:关于返回标头列表的 HttpHeaders,CORS 可以暴露这些标头,请参见 security.cors.exposedHeaders 键。 #### 注意 settings.properties 可通过配置文件路径 config.properties 覆盖 * **${user.home}**/conf-global/config.properties * **${user.home}**/conf/config.properties * **${user.home}**/cfg/**${servletContextPath}**/config.properties ### ApiBackend 配置 JSON 实体对象或字节数组资源 **ApiBackend ResponseType** 现在可以是 **字节数组资源**。 **下载** 任何内容作为 **字节数组**,包括通用扩展文件(请参见 **[MediaTypes](#The-MediaTypes-safe-extensions-configuration)** 部分) **ResourceMatchers** 配置可以针对特定的字节数组资源路径 以及特定方法 **GET、POST、PUT、PATCH** 和 Ant 路径模式: **设置键 settings.properties:** | **键 方法** 和 **键 路径模式** | **默认值** | **内容类型** | |-------------------------------------------------------|:-----------------|:---------------------| | nexus.backend.api-backend-resource.matchers.1.method | GET | | | nexus.backend.api-backend-resource.matchers.1.pattern | /api/encoding/** | text/html;charset=utf-8 | | nexus.backend.api-backend-resource.matchers.2.method | GET | | | nexus.backend.api-backend-resource.matchers.2.pattern | /api/streaming/**| application/octet-stream | | nexus.backend.api-backend-resource.matchers.3.method | GET | | | nexus.backend.api-backend-resource.matchers.3.pattern | /api/time/now | text/html;charset=utf-8 | | nexus.backend.api-backend-resource.matchers.{name}[X].method | Methods | | | nexus.backend.api-backend-resource.matchers.{name}[X].pattern | Patterns | | **Http 响应** 被视为 **资源**,HTTP 标头 **"Accept-Ranges: bytes"** 会被注入,允许您使用 HTTP 标头 **'Range: bytes=1-100'** 进行请求,并仅获取所需的字节范围。
并且 Http 响应不会带有 HTTP 标头 **"Transfer-Encoding: chunked"**,因为存在 **Content-Length** 标头。 **注意:** 若要将所有响应配置为 **资源**,请留空方法并使用路径模式=/api/** | **键 方法** 和 **键 路径模式** | **默认值** | |-------------------------------------------------------|:----------| | nexus.backend.api-backend-resource.matchers.matchers1.method | | | nexus.backend.api-backend-resource.matchers.matchers1.pattern | /api/** | **注意 bis:** 若要移除 HTTP 标头 **"Transfer-Encoding: chunked"**,需要计算 **Content-Length** 标头。 在配置中启用 **ShallowEtagHeader Filter**,以强制为所有 **响应 JSON 实体对象** 计算标头 **Content-Length**,不再有 HttpHeader **"Transfer-Encoding: chunked"**。 ### 媒体类型安全扩展配置 **媒体类型安全扩展** Spring ContentNegotiation 会加载可扩展的安全扩展文件。 加载通用 MediaTypes 属性文件 [resources/mime/MediaTypes_commons.properties](https://github.com/javaguru/nexus-backend/blob/master/src/main/resources/mime/MediaTypes_commons.properties) 并可禁用: **设置键 settings.properties:** 默认标头内容协商策略: | **内容协商策略** | **默认值** | **策略描述** | |------------------------------------------------|:----------|:---------------| | **Header Strategy** | | | | nexus.backend.content.negotiation.ignoreAcceptHeader | false | 标头策略已启用 | | **参数策略** | | | | nexus.backend.content.negotiation.favorParameter | false | 参数策略已禁用 | | nexus.backend.content.negotiation.parameterName | mediaType | | | **注册扩展** | | | | nexus.backend.content.negotiation.useRegisteredExtensionsOnly | true | 仅启用注册扩展 | | **加载通用 MediaTypes** | | | | nexus.backend.content.negotiation.commonTypes | true | 已启用 | ### CORS 安全配置 **CORS 安全配置,允许对域和方法进行控制请求** **设置键 settings.properties:** 默认的 Cors 配置: | **Cors 配置** | **默认值** | **示例值** | **描述** | |------------------------------------------|:----------------------------------------------------------------|:--------------------------------------------|:---------------| | nexus.backend.security.cors.credentials | false | true | 启用凭据 | | nexus.backend.security.cors.allowedHttpMethods | GET,POST,PUT
,OPTIONS,HEAD,
DELETE,PATCH | GET,POST,PUT,OPTIONS | 允许的 HTTP 方法列表 | | nexus.backend.security.cors.allowedOriginPatterns | | | 正则表达式域模式 | | nexus.backend.security.cors.allowedOrigins | * | http://localhost:4042,
http://localhost:4083 | 域列表 | | nexus.backend.security.cors.allowedHeaders | Authorization,Cache-Control,
Content-Type,
X-Requested-With,Accept | Authorization,
Cache-Control,
Content-Type | 允许的标头列表 | | nexus.backend.security.cors.exposedHeaders | | Link,X-Custom-Header | 暴露的标头列表 | | nexus.backend.security.cors.maxAge | 3600 | 1800 | 缓存最大时长 | **注意**:如果 credentials 为 true,则 allowedOrigins 不能为通配符 '*',需要提供域列表。 暴露的标头 ### 速率限制配置 **速率限制** 每分钟每 IP 地址 1000 次。 **SpringBoot 键** *nexus.api.backend.interceptor.ratelimit.enabled* 设置为 **true** 以激活速率限制。 **设置键 settings.properties:** 默认的 Cors 配置: | **Cors 配置** | **默认值** | **示例值** | **描述** | |------------------------------------------------|:----------|:----------|:---------| | nexus.backend.interceptor.ratelimit.refillToken | 1000 | 100 | 填充令牌数 | | nexus.backend.interceptor.ratelimit.refillMinutes | 1 | 1 | 持续时间(分钟) | | nexus.backend.interceptor.ratelimit.bandwidthCapacity | 1000 | 100 | 桶容量 | ### Nexus-Backend 完全支持 MultipartRequest 和 Form-data HttpRequest 中的 Map 参数 #### MultipartConfig **SpringBoot 键 application.properties:** | **键** | **默认值** | **示例值** | **描述** | |----------------------------------------------|:----------|:----------|:------------| | spring.servlet.multipart.enabled | true | true | 启用 multipart | | spring.servlet.multipart.file-size-threshold | 2MB | 5MB | 文件大小阈值 | | spring.servlet.multipart.max-file-size | 15MB | 150MB | 最大文件大小 | | spring.servlet.multipart.max-request-size | 15MB | 150MB | 最大请求大小 | **注意**:所有 **Content-Type 为 multipart/form-data** 的 Http 请求都将由临时 **BackendResource** 管理。 ~~此 BackendResource 可以将 **MultipartFile** 转换为临时 **Resource**,准备发送到 **Backend Server**。~~ 从 1.0.24 版本起,不再使用 BackendResource 和临时文件,所有内容均在内存中完成。 ### BackendService HttpFactory 客户端配置 **设置键 settings.properties:** | **键** | **默认值** | **示例值** | **描述** | |-----------------------------------------------------|:----------|:----------|:--------------------------| | nexus.backend.client.header.user-agent | JavaNexus | curl | 用户代理标头 | | nexus.backend.client.connectTimeout | 10 | 5 | 连接超时(秒) | | nexus.backend.client.requestTimeout | 20 | 10 | 请求超时(秒) | | nexus.backend.client.socketTimeout | 10 | 5 | Socket 超时(秒) | | nexus.backend.client.max_connections_per_route | 20 | 30 | 每路由最大连接数 | | nexus.backend.client.max_connections | 100 | 300 | 连接池最大连接数 | | nexus.backend.client.close_idle_connections_timeout | 0 | 0 | 关闭空闲连接超时 | | nexus.backend.client.validate_after_inactivity | 2 | 2 | 非活动后验证 | | nexus.backend.client.retryCount | 3 | 0 | 重试次数 | | nexus.backend.client.redirectsEnabled | true | true | 启用重定向 | | nexus.backend.client.maxRedirects | 5 | 2 | 最大重定向次数 | | nexus.backend.client.authenticationEnabled | false | true | 启用身份验证 | | nexus.backend.client.circularRedirectsAllowed | false | true | 允许循环重定向 | | nexus.backend.client.cookie.domain | | postman-echo.com | Cookie 域或空或 #{null} | | nexus.backend.client.cookie.secure | false | true | 移除安全 Cookie | ### Nexus-Backend 防火墙与 WAF 过滤器配置 **Nexus-Backend** 实现了 **HttpFirewall** 防护以防止规避,并拒绝任何可疑的 Http 请求 在标头、Cookie、参数、键和值上。 **WAF Filter** 实现了针对 **Json Http 请求体** 的安全 WAF 防护以防止规避。 **未标准化** 的 Http 请求会被 **StrictHttpFirewall** 自动拒绝, 并且会移除用于匹配的路径参数和重复斜杠。 **注意**:有效字符在 **RFC 7230** 和 **RFC 3986** 中定义, 由 **Apache Coyote http11 处理器** 检查(请参见 coyote Error parsing HTTP request header)。 所有带有 **Cookie、标头、参数和请求体** 的 Http 请求都将被过滤, 并且有问题的 **IP 地址** 将被记录。 **设置键 settings.properties:** | **键** | **默认值** | **描述** | |------------------------------------------------------------|:------------------------------------|:------------------------------| | nexus.backend.security.allowedHttpMethods | GET,POST,PUT,OPTIONS,
HEAD,DELETE,PATCH | 允许的 HTTP 方法 | | nexus.backend.security.allowSemicolon | false | 允许分号 | | nexus.backend.security.allowUrlEncodedSlash | false | 允许编码斜杠 | | nexus.backend.security.allowUrlEncodedDoubleSlash | false | 允许编码双斜杠 | | nexus.backend.security.allowUrlEncodedPeriod | false | 允许编码点号 | | nexus.backend.security.allowBackSlash | false | 允许反斜杠 | | nexus.backend.security.allowNull | false | 允许空值 | | nexus.backend.security.allowUrlEncodedPercent | false | 允许编码百分号 | | | nexus.backend.security.allowUrlEncodedCarriageReturn | false | 允许编码回车符 | | | nexus.backend.security.allowUrlEncodedLineFeed | false | 允许编码换行符 | | | nexus.backend.security.allowUrlEncodedParagraphSeparator | false | 允许编码段落分隔符 | | | nexus.backend.security.allowUrlEncodedLineSeparator | false | 允许编码行分隔符 | **WAF 实用程序谓词检查潜在规避:** * XSS 脚本注入 * SQL 注入 * Google 注入 * 命令注入 * 文件注入 * 链接注入 **实现用于潜在规避的标头或参数的 WAF 谓词:** * 标头名称 / 标值 * 参数名称 / 参数值 * 主机名 * 用户代理 **并检查基于长度的缓冲区溢出规避:** * 参数名称最大 255 个字符 / 值最大 1000000 个字符 * 标头名称最大 255 个字符 / 值最大 25000 个字符 * 主机名最大 255 个字符 **WAF 反应模式配置:** * **STRICT_ONNX_AI**:严格模式 + 通过 ONNX 神经网络的人工智能扫描 * **ONNX_AI**:通过 ONNX 神经网络的人工智能扫描 * **STRICT**:严格 HttpFirewall + JSON 请求体 * **PASSIVE**:严格 HttpFirewall + 干净的 JSON 请求体和参数映射 * **UNSAFE**:严格 HttpFirewall + 不检查 JSON 请求体! **AI 模型 ONNX 模型/model.onnx** **设置键 settings.properties:**定义模型和分词器文件 | **键** | **默认值** | **描述** | |----------------------------------------------|:-----------------------------|:-----------------| | nexus.api.backend.analyzer.onnx.maxLength | 512 | 最大 Token 长度 | | nexus.api.backend.analyzer.onnx.truncation | false | 截断 | | nexus.api.backend.analyzer.onnx.path.model | model/nexus_v10_14_int8.onnx | AI 模型 ONNX | | nexus.api.backend.analyzer.onnx.path.tokenizer | model/tokenizer.json | 分词器文件 | | nexus.api.backend.analyzer.onnx.cpu | 4 | CPU 数量 | **设置键 settings.properties:**定义标头或参数键/值长度的最大值 | **键** | **默认值** | **描述** | |----------------------------------------------------------|:----------|:------------------------| | nexus.backend.security.predicate.parameterNamesLength | 255 | 参数名称最大长度 | | nexus.backend.security.predicate.parameterValuesLength | 1000000 | 参数值最大长度 | | nexus.backend.security.predicate.headerNamesLength | 255 | 标头名称最大长度 | | nexus.backend.security.predicate.headerNamesValuesLength | 25000 | 标头值最大长度 | | nexus.backend.security.predicate.hostNamesLength | 255 | 主机名称最大长度 | | nexus.backend.security.predicate.hostName.pattern | | 主机名模式过滤器 | | nexus.backend.security.predicate.userAgent.blocked | false | 激活扫描器 UserAgent 过滤器 | | nexus.backend.security.predicate.aiUserAgent.blocked | true | 激活 AI UserAgent 过滤器 | | nexus.backend.security.predicate.aiUserAgent.blocked | true | 激活 AI UserAgent 过滤器 | ### 激活 HttpFactory 客户端的双向身份验证或 mTLS 连接 **设置键 settings.properties:** *nexus.backend.client.ssl.mtls.enable* 设置为 **true** 以激活 mTLS 连接 | **键** | **默认值** | **描述** | |-------------------------------------------|:-----------------|:------------------| | nexus.backend.client.ssl.mtls.enable | **false** | 激活双向 TLS | | nexus.backend.client.ssl.key-store | nexus-default.jks | Java KeyStore 路径 | | nexus.backend.client.ssl.key-store-password | changeit | 密码 | | nexus.backend.client.ssl.certificate.alias | key_server | 证书别名 | | nexus.backend.client.ssl.https.protocols | TLSv1.3 | 协议 | | nexus.backend.client.ssl.https.cipherSuites | TLS_AES_256_GCM_SHA384 | 密码套件 | ### 激活 Tomcat Catalina 连接器 TLS/SSL(通配符域证书) **设置键 settings.properties:** **SpringBoot 键** *nexus.backend.tomcat.connector.https.enable* 设置为 **true** 以激活 TLS/SSL 协议 | **键** | **默认值** | **描述** | |------------------------------------------------------|:--------------|:------------------| | nexus.backend.tomcat.ssl.keystore-path | /home/root/.keystore | Java KeyStore 路径 | | nexus.backend.tomcat.ssl.keystore-password | changeit | 密码 | | nexus.backend.tomcat.ssl.certificate.alias | key_server | 证书别名 | | nexus.backend.tomcat.ssl.https.port | 8443 | Https 端口 | | nexus.backend.tomcat.ssl.ajp.connector.enable | false | 启动 Ajp 连接器 | | nexus.backend.tomcat.ssl.ajp.connector.port | 8009 | Ajp 端口 | | nexus.backend.tomcat.ssl.ajp.connector.protocol | AJP/1.3 | AJP 版本 1.3 | | nexus.backend.tomcat.ssl.ajp.connector.secretRequired | false | 需要密钥 | ### 激活 Tomcat Catalina 扩展访问日志阀 **设置键 settings.properties:** **SpringBoot 键** *nexus.backend.tomcat.accesslog.valve.enable* 设置为 **true** 以激活访问日志 | **键** | **默认值** | **描述** | |--------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------|:----------------| | nexus.backend.tomcat.accesslog.directory | /tmp/logs/tomcat-nexus | 访问日志目录 | | nexus.backend.tomcat.accesslog.suffix | .log | 后缀 | | nexus.backend.tomcat.accesslog.encoding | UTF-8 | 编码 | | nexus.backend.tomcat.accesslog.pattern | date time x-threadname c-ip cs-method cs-uri
sc-status bytes x-H(contentLength)time-taken
x-H(authType) cs(Authorization) cs(User-Agent) | 模式 | | nexus.backend.tomcat.accesslog.checkExists | true | 检查文件是否存在 | | nexus.backend.tomcat.accesslog.asyncSupported | true | 支持异步请求 | | nexus.backend.tomcat.accesslog.renameOnRotate | true | 轮转时重命名 | | nexus.backend.tomcat.accesslog.throwOnFailure | true | 失败时抛出异常 | | nexus.backend.tomcat.accesslog.maxDay | -1 | 文件保留最大天数 | **注意**:完整的访问日志可通过 **CommonsRequestLoggingFilter** 获取,包含 **RequestBody**。 已初始化,通过将 logback.xml 设置为 **level="DEBUG"** 激活。 ## 构建 Nexus-Backend [Java](https://jdk.java.net/archive/) [SpringBoot](https://projects.spring.io/spring-boot/) [Tomcat](https://tomcat.apache.org/download-10.cgi) [Maven](https://maven.apache.org/download.cgi) ### 构建要求 * Java 21 * SpringBoot 3.3.0 * Tomcat 10.0.53 & Servlet 6.0.0(Jakarta) * Maven 3.9.x ### 使用 withoutTomcat 配置文件构建 war(外部 Tomcat 9) * `mvn clean compile -P withoutTomcat` * `mvn clean package -P withoutTomcat` * `mvn clean install -P withoutTomcat` 并查找 `target/nexus-backend-{version}.war` ### 使用 withTomcat 配置文件构建 jar(嵌入式 Tomcat 9) * `mvn clean compile -P withTomcat` * `mvn clean install -P withTomcat` * `mvn clean package -P withTomcat` 并查找 `target/nexus-backend-{version}.jar` ### 获取 Javadoc `mvn javadoc:javadoc` ### 运行 SpringBoot 应用 使用 Maven(-XX:NativeTracking=summary 用于监控 ONNX 神经网络的本机内存跟踪): `mvn spring-boot:run -P withTomcat -Dspring-boot.run.jvmArguments="-Dspring.profiles.active=withTomcat -XX:NativeMemoryTracking=summary"` 使用 Maven 和开发环境: `mvn spring-boot:run -P withTomcat -Dspring-boot.run.jvmArguments="-Denvironment=development -Dspring.profiles.active=withTomcat -XX:NativeMemoryTracking=summary"` ### 配置 默认情况下,它使用 `8082` 端口和 Servlet 上下文 `/nexus-backend`。 默认的 SpringBoot 配置文件位于 `/src/main/resources/application.properties`。 默认的 NexusBackend 配置文件位于 `/src/main/resources/settings.properties`。 配置键和值可以通过外部路径文件覆盖,例如: * 文件 `{user.home}/conf-global/config.properties` * 文件 `{user.home}/conf/config.properties` * 文件 `{user.home}/cfg/nexus-backend/config.properties` ### Swagger 测试环境 请参见 RestControllerTest,它与 MockController 交互,运行测试时使用本地运行在 localhost:8082/nexus-backend 的 Tomcat。 开发模式下,Swagger Mock-Api 可用,需在 JVM 选项中添加:-Denvironment=development ## BackendService API 实现 此 API 实现用于与后端服务器通信。 它为后端侧支持的所有 HTTP 协议提供方法。 通常,它与一个 API 接口 Backend 进行通信。 ### 可用的 HTTP 方法: * Get * Post * Post Multipart File * Put * Put Multipart File * Patch * Patch Multipart File * Delete ### 示例 BackendService API #### 先决条件: * **RestOperations** 应配置为使用 Apache-HttpClient,并正确配置池化连接。 * **HttpMessageConverter** 也是必需的,StringHttp、FormHttp、ByteArrayHttp、ResourceHttp 和 MappingJackson2Http 是最小集。 * **类型化响应** 参数 Class 对象或 ParameterizedTypeReference 是必需的。 * **Object.class** 不能直接转换为 Resource 或 ByteArray,而无需最小的类型化响应支持。 #### 初始化 RestApi BackendService ``` BackendService backendService = new BackendServiceImpl(); backendService.setBackendURL("https://internal.domain.com:9094"); backendService.setRestOperations(new RestTemplate()); backendService.setObjectMapper(new ObjectMapper()); ``` #### 获取数据 ``` Data data = backendService.get("/mock/v1/data", backendService.createResponseType(Data.class)); ``` #### 获取列表数据 ``` ResponseType
- > typeReference = backendService.createResponseType(new ParameterizedTypeReference<>(){});
List list = backendService.get("/mock/v1/dataList", typeReference);
```
#### 获取资源文件
```
Resource image = backendService.getFile("/static/images/logo-marianne.svg");
FileUtils.copyInputStreamToFile(image.getInputStream(), new File(System.getProperty("java.io.tmpdir") + "/logo-marianne.svg"));
```
#### 执行请求列表数据
```
ResponseType
- > typeReference = backendService.createResponseType(new ParameterizedTypeReference<>(){});
Object obj = backendService.doRequest("/mock/v1/dataList", HttpMethod.GET, typeReference, null, null);
System.out.println(obj);
```
#### 执行请求资源
```
Resource resource = backendService.doRequest("/mock/v1/datafile", HttpMethod.GET,
backendService.createResponseType(Resource.class), null, headers); // WARN mandatory typed Resource.class
String data = StreamUtils.copyToString(resource.getInputStream(), Charset.defaultCharset());
System.out.println(data);
```
#### 执行请求字节数组
```
ResponseType
标签:AI WAF, Apex, API网关, C++, CNCF毕业项目, Cookie管理, DistilBERT, HTTP安全, Java Servlet, JNI, JSON解析, JS文件枚举, NLP威胁检测, ONNX, SEO: AI安全, SEO: 智能防护, SEO: 高性能API, Tomcat, Web防护, 企业级安全, 内存安全, 反向代理, 域名枚举, 安全网关, 数据擦除, 文件上传, 早期退出架构, 本地推理, 机器学习, 毫秒级响应, 流式响应, 流量清洗, 深度包检测, 滑动窗口分块, 网络安全分析, 表单数据, 请求分析, 速率限制, 重定向, 量化模型, 零日攻击防御, 高可用网关