java - 使用 Spring Web Sockets 和 STOMP 的自定义 Jetty WebSocketPolicy
问题描述
我想WebSocketPolicy
在使用带有 STOMP 的 Spring Web Sockets 时自定义 Jetty。
这是我的配置类:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
registration.setMessageSizeLimit(128 * 1024);
}
}
通过 设置消息大小限制时WebSocketTransportRegistration
,它并不能解决问题,因为 Jetty 在涉及 Spring 之前进行了文本消息大小检查。您可以通过以下堆栈跟踪查看它:
org.eclipse.jetty.websocket.api.MessageTooLargeException: Text message size [70412] exceeds maximum size [65536]
at org.eclipse.jetty.websocket.api.WebSocketPolicy.assertValidTextMessageSize(WebSocketPolicy.java:140) ~[websocket-api-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.websocket.common.Parser.assertSanePayloadLength(Parser.java:127) ~[websocket-common-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.websocket.common.Parser.parseFrame(Parser.java:485) ~[websocket-common-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.websocket.common.Parser.parse(Parser.java:241) ~[websocket-common-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.readParse(AbstractWebSocketConnection.java:560) [websocket-common-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onFillable(AbstractWebSocketConnection.java:391) [websocket-common-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:281) [jetty-io-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102) [jetty-io-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118) [jetty-io-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333) [jetty-util-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310) [jetty-util-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168) [jetty-util-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126) [jetty-util-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366) [jetty-util-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:762) [jetty-util-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:680) [jetty-util-9.4.11.v20180605.jar:9.4.11.v20180605]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_101]
因此,我正在寻找一种方法来提供自定义WebSocketPolicy
并在创建时传递它,JettyRequestUpgradeStrategy
但我找不到方法来做到这一点。
当使用以下配置类但它错过了消息代理配置时,它看起来是可能的:
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
}
解决方案
解决方案很简单,但没有记录...
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setHandshakeHandler(handshakeHandler());
registry.addEndpoint("/ws").setHandshakeHandler(handshakeHandler()).withSockJS();
}
@Bean
public DefaultHandshakeHandler handshakeHandler() {
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
policy.setMaxTextMessageSize(128 * 1024);
return new DefaultHandshakeHandler(new JettyRequestUpgradeStrategy(policy));
}
}
推荐阅读
- python - 加载没有顶部的本地 h5 模型
- android - 新的 Web 服务器为 Android 应用程序中的证书路径未找到异常创建信任锚
- django - 如何在 Django 中使用不同级别关系的字段“order_by”模型对象
- python - 使用 distutils 将 C 代码集成到 Python 库中的最常规方法是什么?
- git - 如果对 deployment.yml 没有更改,则无法使用 Jenkins 将 Docker 映像部署到 Kubernetes
- networking - 是否可以使用 ICMP 第 3 层发送十六进制字符串?
- javascript - 使用按值嵌套的数组过滤对象数组
- python - 带有标签和移动电子邮件的 Python GMail 代码行为异常
- node.js - 无法安装反应导航堆栈
- spring - 如何禁用/启用 - 使用 Spring 引导配置文件的 Confluent KAFKA 拦截器?