【问题标题】:Java (Tomcat) websocket parameters from client side来自客户端的 Java (Tomcat) websocket 参数
【发布时间】:2020-03-06 17:51:41
【问题描述】:

我需要将一些参数从 javascript 客户端传递到 Tomcat 中的 Java 端点。

使用 Tomcat,您可以使用@ServerEndpoint(value="/websocket")注释您的 java 类,然后这个类将成为您的 websocket 的端点。

即每次 javascript 调用 new WebSocket("ws://localhost/websocket") 时,您的注释类都会被实例化。

现在我想在实例化期间(即在构造函数中)从 javascript 客户端将一个短字符串参数(或 int,并不重要)传递给我的注释类最好

我该怎么做?

我曾想过将其放入 url,但随后我需要做其他事情而不是注释,因此感觉不太安全。

【问题讨论】:

  • 你可以展示你尝试过的东西吗?
  • 我可以用@ServerEndpoint(value = "/websocket/{clientId}") 做到这一点。但是有什么办法可以不在url中包含参数?

标签: java tomcat websocket


【解决方案1】:

您可以将其作为标头传递,并且暴露 Web 套接字的 Java Tomcat 端点必须读取标头并将其设置为端点配置的用户属性映射 示例

公共类 WsHandShakeInterceptor 扩展 ServerEndpointConfig.Configurator {

@Override
public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
    super.modifyHandshake(sec, request, response);

    setUserHeadersAsProps(sec, request);
}

private void setUserHeadersAsProps(ServerEndpointConfig sec, HandshakeRequest request) {
    Map<String, List<String>> headers = request.getHeaders();
    if (headers != null) {
        List<String> userNameHeader = headers.get(HeadersConst.OIDC_CLAIM_USERNAME);
        if (userNameHeader != null && !userNameHeader.isEmpty()) {
            sec.getUserProperties().put(HeadersConst.X_FORWARDED_USER, userNameHeader.get(0));
        }
    }
}

}

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多