You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java EE中如何获取session.getRequestURI()的端口?端口返回-1求助

解决WebSocket Session getRequestURI().getPort()返回-1的问题

我之前帮开发者排查过类似的Tomcat WebSocket端口获取异常的问题,咱们一步步来分析和解决:

问题原因

在Tomcat 9的WebSocket实现中,Session.getRequestURI()返回的URI对象可能没有正确保留请求的端口信息——尤其是当使用非默认端口(比如你的62114)时,Tomcat在处理HTTP升级到WebSocket的过程中,可能没有将端口信息完整传递到Session的URI实例中,导致getPort()返回-1。

可靠解决方案:从原始HttpServletRequest获取端口

WebSocket连接是基于HTTP请求升级而来的,我们可以通过EndpointConfig获取到升级时的原始HttpServletRequest对象,从中直接获取正确的端口:

@OnOpen
@Encoded
public void onOpen(@PathParam("BenutzerID") Long BenutzerID, 
                   @PathParam("Grad") long Kontaktgrad, 
                   @PathParam("Accesskey") String Accesskey, 
                   Session session, 
                   EndpointConfig config) {
    // 从EndpointConfig中取出原始HTTP请求对象
    HttpServletRequest request = (HttpServletRequest) config.getUserProperties()
                                                               .get("javax.servlet.http.request");
    if (request != null) {
        // 这里会获取到正确的服务端口(比如你的62114)
        this.port = request.getServerPort();
    } else {
        // 降级处理,保留原逻辑避免空指针
        this.port = session.getRequestURI().getPort();
    }
}

额外检查项

  • 确认Tomcat端口配置:打开Tomcat的conf/server.xml,检查Connector节点的port属性是否确实设置为62114;同时在Eclipse的Servers视图中,双击Tomcat服务器,查看“Ports”标签页,确保HTTP端口没有被Eclipse自动修改。
  • 代理场景适配(如果适用):如果你的Tomcat部署在反向代理之后,需要在Tomcat配置中添加RemoteIpValve,并确保代理传递了X-Forwarded-Port请求头,这样request.getServerPort()才能拿到真实的前端端口。

内容的提问来源于stack exchange,提问作者Hans-Martin Goebel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:15:35