是否可以从 javax.websocket.Session 实例获取 Websocket 连接源?

Is it possible to get Websocket connection Origin from a javax.websocket.Session instance?

我在我的 WebSocket 服务器中使用 Jetty 的 jsr356 WebSocket API 实现,出于某种原因,我希望能够通过当前 javax.websocket.Session 对象获取连接 Origin 值。

我知道我可以在服务器端点内建立连接时获取来源 Configurator,但是我可以在消息到达后从会话对象中获取来源吗?

谢谢!

Origin header 只是客户端发送的一段输入,所以不可信。在 well-behaving 浏览器中(当然,禁用了开发人员扩展!)该值用于告诉主机名客户端脚本是从中下载的。也就是说,您可以在 Session object:

上查询升级请求的 headers
String origin = session.getUpgradeRequest().getHeader("Origin");

Origin header 是在 WebSocket 升级握手时发送的,您可以选择 accept/deny 使用自定义 Configurator、and/or 捕获 Origin 并将其存储在该升级的用户属性中,供 session.getUserProperties()

稍后使用

看看javax.websocket.server.ServerEndpointConfig.Configurator.

您可以在升级时使用Configurator.checkOrigin(String)验证来源header,用于allow/deny升级。

您还可以使用 Configurator.modifyHandshake(ServerEndpointConfig, HandshakeRequest, HandshakeResponse) 捕获 Origin 头部并将其放入 UserProperties 映射以供以后访问。

例如:

@Override
public void modifyHandshake(ServerEndpointConfig sec, 
                            HandshakeRequest request, 
                            HandshakeResponse response)
{
    sec.getUserProperties().put("TheUpgradeOrigin",request.getHeaders().get("Origin"));
    // Note: this store a List<String> in the key "TheUpgradeOrigin"
}

然后稍后在您的端点中...

@OnMessage
public String onTextMessage(Session session, String msg)
{
    List<String> originHeader = (List<String>)session.getUserProperties()
                                                     .get("TheUpgradeOrigin");

    // Do something with this header

    return msg;
}