来自客户端的 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 参数的主要内容,如果未能解决你的问题,请参考以下文章