来自客户端的 Java (Tomcat) websocket 参数

Posted

技术标签:

【中文标题】来自客户端的 Java (Tomcat) websocket 参数【英文标题】:Java (Tomcat) websocket parameters from client side 【发布时间】: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中包含参数? 【参考方案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。

以上是关于来自客户端的 Java (Tomcat) websocket 参数的主要内容,如果未能解决你的问题,请参考以下文章

Java Web如何获取客户端的Hostname?

JavaWeb——下载并安装Tomcat服务器

学习总结------Servlet的简单理解

Java Web Servlet详解

利用IDEA创建Web Service服务端和客户端的详细过程

java之servlet学习基础