是否可以从 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;
}
我在我的 WebSocket 服务器中使用 Jetty 的 jsr356 WebSocket API 实现,出于某种原因,我希望能够通过当前 javax.websocket.Session
对象获取连接 Origin 值。
我知道我可以在服务器端点内建立连接时获取来源 Configurator
,但是我可以在消息到达后从会话对象中获取来源吗?
谢谢!
Origin
header 只是客户端发送的一段输入,所以不可信。在 well-behaving 浏览器中(当然,禁用了开发人员扩展!)该值用于告诉主机名客户端脚本是从中下载的。也就是说,您可以在 Session
object:
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;
}