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

如何获取WebSocket客户端请求的来源网站URL?

在Java WebSocket服务器中获取调用方网站URL

我在用户PC的localhost部署了WebSocket服务器,foo.domain.com的网站通过wss://localhost/sign调用该WebSocket服务器,服务器处理信息后返回数据给网站。

目前一切运行正常,但我希望在WebSocket服务器中获取调用方网站的URL(即foo.domain.com)。当前我使用session.getRequestURI().getHost()获取到的始终是127.0.0.1,推测是因为网站的JavaScript代码和WebSocket服务器运行在同一台用户设备上。我的WebSocket服务器基于Java开发,相关代码如下:

package com.foo.service;

import org.eclipse.jetty.websocket.core.exception.WebSocketTimeoutException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Inject;
import javax.swing.*;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.CountDownLatch;

@ServerEndpoint(value = "/sign", decoders = SignatureRequestDecoder.class, encoders = SignatureResponseEncoder.class)
public class SignEndpoint {
    // Some variables here
    
    @OnMessage
    public void onSignSocketRequest(Session session, SignatureRequest request) throws IOException, EncodeException {
        logger.info("Signature request received.");
        String test = session.getRequestURI().getHost();
        String test1 = session.getRequestURI().getPath();
        String test2 = session.getRequestURI().getFragment();
        String test3 = session.getRequestURI().getQuery();
        String test4 = session.getRequestURI().getScheme();
        logger.info("Test = " + test); // Prints 127.0.0.1
        logger.info("Test1 = " + test1); // Prints /sign
        logger.info("Test2 = " + test2); // Prints null
        logger.info("Test3 = " + test3); // Prints null
        logger.info("Test4 = " + test4); // Prints wss

        // More code here
    }

    // More methods here
}

我不确定能否通过Session参数获取目标URL,或者是否有其他方法。如果客户端是桌面应用,那获取URL可能没有意义。我也考虑过是否能在WebSocket协议从HTTP转向WS的首次协议重定向阶段获取该URL。

编辑补充

按照建议,我实现了一个自定义Configurator来获取Origin头,现在可以从WebSocket请求中读取该来源信息。

自定义Configurator代码:

public class ServletAwareConfig extends ServerEndpointConfig.Configurator {
    @Override
    public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) {
        config.getUserProperties().put("Origin", request.getHeaders().get("Origin"));
    }
}  

我将该Configurator添加到@ServerEndpoint注解中,在@OnOpen方法中保存其值,并在@OnMessage方法中读取:

@ServerEndpoint(value = "/sign", decoders = SignatureRequestDecoder.class, encoders = SignatureResponseEncoder.class,
                configurator = ServletAwareConfig.class)
public class SignEndpoint {
    private EndpointConfig endpointConfig;

    @OnOpen
    public void onSignSocketOpen(Session session, EndpointConfig endpointConfig) {
        this.endpointConfig = endpointConfig;  
        // More code here.
    }

    @OnMessage
    public void onSignSocketRequest(Session session, SignatureRequest request) {
        List<String> originHeader = (List<String>) endpointConfig.getUserProperties().get("Origin");
        // More code here.
    }
}

内容的提问来源于stack exchange,提问作者RobertGG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:32:11