首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以从javax.websocket.Session实例获取Websocket连接源?

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

Stack Overflow用户
提问于 2015-08-27 09:47:37
回答 2查看 2.1K关注 0票数 0

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

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

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-27 13:40:15

Origin报头是在WebSocket升级握手过程中发送的,您可以选择接受/拒绝使用自定义Configurator进行websocket升级,并/或将Origin捕获并存储在用户属性中,供session.getUserProperties()以后使用。

看看javax.websocket.server.ServerEndpointConfig.Configurator

您可以使用Configurator.checkOrigin(字符串)在升级时验证源标头,它用于允许/拒绝升级。

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

例:

代码语言:javascript
复制
@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"
}

然后在你的终点..。

代码语言:javascript
复制
@OnMessage
public String onTextMessage(Session session, String msg)
{
    List<String> originHeader = (List<String>)session.getUserProperties()
                                                     .get("TheUpgradeOrigin");

    // Do something with this header

    return msg;
}
票数 0
EN

Stack Overflow用户

发布于 2015-08-27 10:20:53

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

代码语言:javascript
复制
String origin = session.getUpgradeRequest().getHeader("Origin");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32246047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档