是否有可能从javax.websocket.Session实例获得Websocket连接起源?



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

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

谢谢!

在WebSocket升级握手期间发送Origin头,您可以选择接受/拒绝使用自定义Configurator的WebSocket升级,和/或捕获并存储Origin在该升级的用户属性中供session.getUserProperties()以后使用

javax.websocket.server.ServerEndpointConfig.Configurator

您可以使用configuration . checkorigin (String)在升级时验证origin头,它用于允许/拒绝升级。

您还可以使用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;
}

Origin报头只是客户端发送的一段输入,因此它不能被信任。在运行良好的浏览器中(当然,禁用了开发人员扩展!),该值用于告诉客户端脚本是从哪个主机名下载的。也就是说,您可以在Session对象上查询升级请求的标头:

String origin = session.getUpgradeRequest().getHeader("Origin");

最新更新