在 Websocket 会话中访问用户代理


使用 Java 的

"JSR 356 - Java API for WebSocket"的 Tyrus 参考实现,我找不到访问用于 Websocket 升级的 HTTP 连接的方法。因此,我无法访问浏览器发送的HTTP标头。

有没有办法读取HTTP UserAgent标头?

将"会话"对象转换为"TyrusSession"或类似对象是可以接受的,无论如何我都必须这样做才能获得远程地址。在 Websocket 连接内再次发送用户代理作为消息将是我的回退解决方案。

警告:ServerEndpointConfig 在所有端点实例之间共享,并且可以同时完成多个升级请求!查看评论!

端点获取一个配置器:

import javax.websocket.EndpointConfig;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint(value = "/foo", configurator = MyServerEndpointConfigurator.class)
public class MyEndpoint {
    @OnOpen
    public void onOpen(Session session, EndpointConfig endpointConfig) throws Exception {
        String ip = ((TyrusSession) session).getRemoteAddr();
        String userAgent = (String) endpointConfig.getUserProperties().get("user-agent");
        ...
   }
}

配置器如下所示:

import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;
public class MyServerEndpointConfigurator extends ServerEndpointConfig.Configurator {
    @Override
    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
        if (request.getHeaders().containsKey("user-agent")) {
            sec.getUserProperties().put("user-agent", request.getHeaders().get("user-agent").get(0)); // lower-case!
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新