如何获取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
相关产品推荐
相关产品推荐

