| name | find-route |
| description | Java 项目路由端点发现。使用 JetBrains 工具查找所有 Controller、Servlet、JSP、RPC 服务、JAX-RS、WebSocket 端点,输出路由类清单 JSON。用于:Java 审计路由发现、攻击面枚举。触发词:find route、路由发现、路由搜索、endpoint discovery、Phase 1。 |
路由端点发现 (Phase 1)
适用场景
- Java Web 项目审计中,需要枚举所有路由入口
- 作为
java-audit Phase 1 被调度执行
不适用场景
- 需要分析路由方法内容 → 后续 Phase 处理
- 需要鉴权分析 → 使用
analyze-auth
- 非 Java 项目
前置条件
- Serena MCP 已连接,目标项目已在 JetBrains 中激活
.audit/recon.md 已存在(由 java-audit Phase 0 生成)
反幻觉铁律
1. 每个路由类必须通过 jet_brains_find_symbol 或 find_file 确认存在
2. 文件路径必须来自工具实际输出,不得编造
3. 不确定的发现标记为 [Hypothesis]
工作流程
Step 1: 读取侦察报告
- 读取
.audit/recon.md,获取项目框架信息(Spring / Struts / Servlet / 混合)
Step 2: 搜索 Spring Controller
- 调用
jet_brains_find_symbol("*Controller", symbol_type="class") 查找所有 Controller 类
- 调用
search_for_pattern("@RestController|@Controller") 补充搜索注解声明的非 Controller 命名类
- 对每个找到的类调用
jet_brains_get_symbols_overview 获取方法数量和类级别路径注解
Step 3: 搜索 Servlet
- 调用
jet_brains_type_hierarchy("javax.servlet.http.HttpServlet", hierarchy_type="sub") 查找所有 Servlet 子类
- 同时搜索
jakarta.servlet.http.HttpServlet 子类(Jakarta EE)
- 调用
search_for_pattern("@WebServlet") 搜索注解定义的 Servlet
- 读取
web.xml(如存在),提取 <servlet-mapping> 配置
Step 4: 搜索 JSP 文件
- 调用
find_file("*.jsp") 查找所有 JSP 文件
- 记录文件路径
Step 5: 搜索 RPC 服务
- 调用
search_for_pattern("@DubboService|@Service.*dubbo|@RpcService") 搜索 Dubbo 服务
- 调用
search_for_pattern("@FeignClient") 搜索 Feign 客户端
- 调用
search_for_pattern("@GrpcService") 搜索 gRPC 服务
Step 6: 搜索 JAX-RS 端点
- 调用
search_for_pattern("@Path\\(") 搜索 JAX-RS 路径注解
- 对找到的类用
jet_brains_find_symbol 确认
Step 7: 搜索 WebSocket 端点
- 调用
search_for_pattern("@ServerEndpoint|@MessageMapping") 搜索 WebSocket 端点
Step 8: 汇总输出
将所有发现写入 .audit/routes.json,格式如下:
{
"scan_time": "ISO8601 时间戳",
"framework": "识别到的主框架",
"route_classes": [
{
"class_name": "完全限定类名",
"file_path": "源文件相对路径",
"type": "spring_controller | servlet | jaxrs | rpc | websocket",
"class_level_path": "类级别路径注解值(如有)",
"methods_count": 0
}
],
"jsp_files": ["JSP 文件相对路径列表"],
"summary": {
"total_classes": 0,
"controllers": 0,
"servlets": 0,
"jsp_files": 0,
"rpc_services": 0,
"jaxrs_endpoints": 0,
"websocket_endpoints": 0
}
}
注意事项
- 同一个类可能同时有
@Controller 和 @Path 注解,按主注解分类,避免重复
- 内部类或抽象基类不应直接计入路由,但若有路由注解仍需记录
- 搜索结果可能包含测试类(test/),应排除测试目录下的类