Mac下如何查看已打开的WebSocket?Tomcat WebSocket连接302错误求助
我来帮你逐个解决这两个问题:
这里有几个实用的方法,根据你的需求选择:
浏览器开发者工具(最直观,适合网页端WebSocket)
打开Chrome或者Firefox的开发者工具(按Cmd+Opt+I就能快速唤起),切换到「Network」面板,在顶部的过滤器里选「WS」标签。这里会列出当前页面所有的WebSocket连接,状态显示「Open」的就是正处于打开状态的。点进去还能查看收发的帧数据,非常方便。命令行工具(系统级排查,适合全系统的WebSocket连接)
WebSocket本质是基于TCP的,所以可以用lsof来抓相关的TCP连接:- 先执行
sudo lsof -PiTCP -sTCP:ESTABLISHED,列出所有已建立的TCP连接 - 如果知道目标端口或者地址,再加过滤条件,比如要找连接到localhost:8080的连接,就用:
不过这个只能看到TCP连接,没法直接区分是不是WebSocket,你可以结合浏览器工具的结果来对应。sudo lsof -PiTCP -sTCP:ESTABLISHED | grep 8080
要是想更精准,还能用tcpdump抓包,专门过滤WebSocket的握手流量,监听本地8080端口的话:
这个过滤规则会匹配WebSocket握手请求里的标识,能精准抓到相关连接。sudo tcpdump -i lo0 port 8080 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x57534f43
- 先执行
看到你连接ws://localhost:8080/cs-webapp/ws时返回302,而且已经确认Tomcat在8080端口监听,302是重定向,大概率是路径、配置或者服务器规则的问题,给你几个排查方向:
先确认WebSocket端点的路径是否正确
检查你的WebSocket端点类(比如用@ServerEndpoint注解的那个类),注解里的路径是不是/ws?有没有拼写错误?比如如果注解是@ServerEndpoint("/websocket"),那连接地址就得改成ws://localhost:8080/cs-webapp/websocket。另外还要确认上下文路径cs-webapp是不是对的——如果你的war包是cs-webapp.war,那上下文路径就是/cs-webapp;如果是ROOT.war,那就是根路径,不用加cs-webapp。检查Tomcat的WebSocket支持是否正常
Tomcat 7.0.47及以上版本默认支持WebSocket,但如果是老版本,得确保tomcat/lib目录下有tomcat-websocket.jar和tomcat-websocket-api.jar这两个包,缺的话要补上。一般新版本不需要额外配置,但要是用了旧的API方式,可能得在web.xml里加相关配置。排查是否有重定向规则在起作用
302通常是服务器把请求跳转到别的地址了,比如:- 是不是web.xml里配置了安全约束,强制所有请求用HTTPS?如果是,ws://的请求会被重定向到wss://,这时候就会返回302,你得改用
wss://localhost:8443/cs-webapp/ws(对应Tomcat的HTTPS端口,默认8443)连接。 - 有没有自定义的Filter拦截了
/ws路径的请求,做了重定向?检查web.xml里的Filter配置,或者看看项目里的Filter类逻辑。
- 是不是web.xml里配置了安全约束,强制所有请求用HTTPS?如果是,ws://的请求会被重定向到wss://,这时候就会返回302,你得改用
查看Tomcat的访问日志找线索
去Tomcat的logs目录,找localhost_access_log.*.txt文件,看看这个WebSocket请求的日志条目,比如:127.0.0.1 - - [15/Oct/2024:10:00:00 +0800] "GET /cs-webapp/ws HTTP/1.1" 302 0 "http://localhost:8080/cs-webapp/" "Mozilla/5.0"
日志里会显示重定向的目标地址,从这个地址就能推断原因——比如跳转到HTTPS地址就是强制HTTPS的问题,跳转到其他路径就是路径配置错了。直接用浏览器访问握手地址测试
打开浏览器,输入http://localhost:8080/cs-webapp/ws,看看返回什么:- 如果返回302,看看跳转的地址是什么,对应调整连接地址;
- 如果返回404,说明路径肯定错了,再检查端点配置;
- 如果返回「101 Switching Protocols」,说明端点是正常的,可能是客户端连接代码的问题(比如请求头不对)。
内容的提问来源于stack exchange,提问作者reza

