gpt4 book ai didi

spring - Spring 中 WebSocketConfigurer addHandler 中的路径参数

转载 作者:行者123 更新时间:2023-12-01 08:22:52 54 4
gpt4 key购买 nike

  • 我使用“TextWebSocketHandler”作为 websockets 和“WebSocketConfigurer”来配置 websocket。
  • 我有一个场景,需要对处理程序的不同实例进行处理。

  • 例如:如果我正在为某些项目进行拍卖,那么我需要为每个拍卖 ID 生成单独的 WebSocketHandler 实例。
    我们可以将“auctionId”作为路径参数附加到 url 以便为不同的拍卖生成不同的实例吗?

    或者有没有其他方法可以实现这一目标?

    这就是我添加处理程序的方式:
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    registry.addHandler(websocketTestHandler(), "/websocket-test");
    }

    最佳答案

    如果您想使用 TextWebSocketHandler ,您可以将拍卖 ID 作为 URL 路径的一部分传递。您必须在握手期间复制 WebSocket session 的路径(这是您可以访问 ServerHttpRequest 的唯一位置,因为握手是一个 http 请求),然后从您的处理程序中检索该属性。

    这是实现:

    @Configuration
    @EnableWebSocket
    public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    registry.addHandler(auctionHandler(), "/auction/*")
    .addInterceptors(auctionInterceptor());
    }

    @Bean
    public HandshakeInterceptor auctionInterceptor() {
    return new HandshakeInterceptor() {
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,
    WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {

    // Get the URI segment corresponding to the auction id during handshake
    String path = request.getURI().getPath();
    String auctionId = path.substring(path.lastIndexOf('/') + 1);

    // This will be added to the websocket session
    attributes.put("auctionId", auctionId);
    return true;
    }

    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response,
    WebSocketHandler wsHandler, Exception exception) {
    // Nothing to do after handshake
    }
    };
    }

    @Bean
    public WebSocketHandler auctionHandler() {
    return new TextWebSocketHandler() {
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
    // Retrieve the auction id from the websocket session (copied during the handshake)
    String auctionId = (String) session.getAttributes().get("auctionId");

    // Your business logic...
    }
    };
    }
    }

    客户:
    new WebSocket('ws://localhost:8080/auction/1');

    即使这是一个可行的解决方案,我还是建议您查看 STOMP over WebSockets ,它会给你更多的灵活性。

    关于spring - Spring 中 WebSocketConfigurer addHandler 中的路径参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49378759/

    54 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com