我在我的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");