我来详细分析这段Java WebSocket握手拦截代码:

1. Pattern.compile("/ws/print/progress/([^/]+)") 的含义

这是一个正则表达式,用于匹配和提取WebSocket连接路径中的参数:

  • /ws/print/progress/ - 固定的路径前缀

  • ([^/]+) - 捕获组,匹配一个或多个非斜杠字符

    • [^/] - 匹配任何不是斜杠的字符

    • + - 表示一个或多个

    • 括号()表示这是一个捕获组,可以被后续提取

示例匹配:

  • /ws/print/progress/123 → 匹配,提取"123"

  • /ws/print/progress/abc-xyz → 匹配,提取"abc-xyz"

  • /ws/print/progress/123/ → 不匹配(末尾有斜杠)

  • /ws/print/progress/ → 不匹配(缺少参数)

2. matcher.group(1) 参数为1的原因

在正则表达式中,group(0) 返回整个匹配的字符串,而 group(1) 返回第一个捕获组的内容:

java

// 假设路径是:/ws/print/progress/request123
matcher.group(0) // 返回 "/ws/print/progress/request123"(整个匹配)
matcher.group(1) // 返回 "request123"(第一个捕获组)

分组编号规则:

  • group(0) - 整个正则表达式匹配的内容

  • group(1) - 第一个括号捕获组的内容

  • group(2) - 第二个括号捕获组的内容(如果有的话)

代码功能总结

这段代码在WebSocket握手前执行,用于:

  1. 验证连接路径是否符合预期格式

  2. 从URL路径中提取请求ID(如request123

  3. 将提取的requestId存入attributes,供后续WebSocket会话使用

这种模式常用于REST风格的WebSocket端点,通过URL路径传递参数而不是查询参数。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐