跳转至

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 Exceptione.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 等的请求体原样透传(编码沿用原始字符数据)

请求示例

GET /monitor/redirect/_http/_192.168.1.10/_8083/_obpm-runtime/path/druid/index.html HTTP/1.1

转发后上游 URL(GET 透传 query 示例):

http://192.168.1.10:8083/obpm-runtime/druid/index.html

响应

  • 状态码:上游响应状态码(由 HttpURLConnection 回写);上游异常或本端异常时状态码未显式设置,浏览器侧通常表现为 200 + 空 body(异常被 try/catch 吞掉)。
  • Content-Type:仅当请求方法为 GET 时透传上游 Content-TypehttpUrlConn.getContentType());其他方法不显式设置。
  • 响应体:上游响应字节流原样回写到 response.getOutputStream()

成功示例(GET 转发到 Druid 监控页):

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8

<!DOCTYPE html>
<html>
... (Druid 监控页 HTML 原样回写)
</html>
失败示例: 上游不可达或转发过程中抛异常时,控制器在 try/catche.printStackTrace() 吞掉异常,响应 body 为空(状态码未显式设置,HTTP 状态码视容器实现通常仍为 200);鉴权失败时由 ManagerSecurityFilter 直接返回 HTTP 401(无响应体)。

注:本端点不返回统一 Resource;表格、错误码不再适用。需在 adminToken 已登录的前提下访问。