我在我的jsr356服务器中使用了jetty的WebSocket API实现,出于某种原因,我希望能够通过当前的javax.websocket.Session对象获得连接源值。
我知道我可以在服务器端点Configurator内建立连接时获得这个来源,但是在消息到达之后,我能从会话对象获得它吗?
谢谢!
发布于 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映射中,以便以后访问。
例:
@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;
}发布于 2015-08-27 10:20:53
Origin头只是客户端发送的一段输入,因此不能信任它。在性能良好的浏览器中(当然,在禁用开发人员扩展的情况下!)该值用于告诉主机名,客户端脚本是从该主机名下载的。尽管如此,您可以在Session对象上查询升级请求的标题:
String origin = session.getUpgradeRequest().getHeader("Origin");https://stackoverflow.com/questions/32246047
复制相似问题