SystemMonitorController(系统监控代理转发)¶
为管理控制台「系统监控」页提供**反向代理转发**:把前端发来的请求按 URL 中的目标 scheme/host/port/contextPath 拼出上游 URL,透传 query 参数与请求体,并把上游响应原样回写给调用方——前端借此在管理控制台中以同源方式访问各微服务的 Druid 监控页等内部端点。
- 类级基址:
${myapps.context-path.manager:}(控制器类级@RequestMapping直接是 context-path,方法级路径为完整相对路径,不带/api/authtime等前缀) - Tag:(控制器未声明
@Tag) - 控制器源码:
obpm-manager/src/main/java/cn/myapps/manager/authtime/controller/monitor/SystemMonitorController.java - 公共说明:
- 控制器**不**继承
BaseAuthTimeController,方法返回void,**不**返回统一Resource;通过直接操作HttpServletResponse的输出流回写上游响应(同步阻塞式 HTTP 转发,使用HttpURLConnection)。 - 转发时强制把请求头
systemToken设置为Security.getSystemToken()(系统间调用令牌),并强制content-type: application/json;**不**回传客户端原始请求头(原代码相应行被注释掉)。 - 客户端 query 参数会被透传到上游 URL,但每个参数值需通过
SecurityURL.simpleSpecialSymbols校验(含特殊字符的值被丢弃);请求体(仅 POST 等带 body 的方法)原样透传。 - 转发过程在
try/catch Exception内e.printStackTrace()后吞掉异常,**不**回写错误信息到响应;上游正常响应时Content-Type透传(仅 GET 请求时)。 - 鉴权说明见 index.md「鉴权说明」(adminToken JWT)。
/monitor/redirect/***不在**鉴权白名单中,仍需 adminToken。
1. 转发请求¶
按 URL 路径变量拼出上游 URL({scheme}://{host}:{port}/{contextPath}{path}),透传客户端的 HTTP 方法、query 参数与请求体到上游,并把上游响应字节流原样回写。前端约定用 _ 前缀占位分隔目标信息(源码注释示例:/manager/monitor/redirect/_${scheme}/_${host}/_${port}/_${contextPath}/path/druid/index.html)。
- 接口类型:REST 资源(HTTP 反向代理,流式响应)
- 请求方式:
GET/POST/PUT/DELETE/PATCH等任意 HTTP 方法(方法体由@RequestMapping不限方法 + 内部request.getMethod()透传;外层CommonSecurityFilter仅放行 GET/POST/HEAD/OPTIONS,其他方法在到达本端点前已被拦截返回 405) - 请求路径:
/monitor/redirect/_{redirectScheme}/_{redirectHost}/_{redirectPort}/_{redirectContextPath}/**(完整:{manager-context}/monitor/redirect/_{redirectScheme}/_{redirectHost}/_{redirectPort}/_{redirectContextPath}/**) - 鉴权:是(需管理员 adminToken,详见 index.md「鉴权说明」)
- Tag:(控制器未声明
@Tag)
路径中的
_{xxx}是「字面下划线 + 路径变量」的固定写法(如_http、_192.168.1.10);后续/**自由段由控制器内部用request.getRequestURI()解析并追加到上游 URL 后(取/path标记之后的部分,如…/path/druid/index.html中的/druid/index.html)。
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| redirectScheme | path | string | 是 | 上游协议(http / https) |
| redirectHost | path | string | 是 | 上游主机(IP 或域名) |
| redirectPort | path | string | 否 | 上游端口,空时回退为 80 |
| redirectContextPath | path | string | 否 | 上游 context-path(为空时拼出的 URL 不带 context-path 段) |
| (任意) | query | string | 否 | 透传到上游的 query 参数,值需通过 SecurityURL.simpleSpecialSymbols 校验 |
| (body) | body | bytes | 否 | GET/HEAD 等无 body;POST/PUT 等的请求体原样透传(编码沿用原始字符数据) |
请求示例¶
转发后上游 URL(GET 透传 query 示例):
响应¶
- 状态码:上游响应状态码(由
HttpURLConnection回写);上游异常或本端异常时状态码未显式设置,浏览器侧通常表现为 200 + 空 body(异常被try/catch吞掉)。 - Content-Type:仅当请求方法为
GET时透传上游Content-Type(httpUrlConn.getContentType());其他方法不显式设置。 - 响应体:上游响应字节流原样回写到
response.getOutputStream()。
成功示例(GET 转发到 Druid 监控页):
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
<!DOCTYPE html>
<html>
... (Druid 监控页 HTML 原样回写)
</html>
try/catch 内 e.printStackTrace() 吞掉异常,响应 body 为空(状态码未显式设置,HTTP 状态码视容器实现通常仍为 200);鉴权失败时由 ManagerSecurityFilter 直接返回 HTTP 401(无响应体)。
注:本端点不返回统一
Resource;表格、错误码不再适用。需在 adminToken 已登录的前提下访问。