spring-boot - 如何使用spring boot stomp在ChannelInterceptor中获取端点路径?

标签 spring-boot stomp

我是 stomp 的新手,使用 spring boot 2.1.2.RELEASE。我有多个端点并配置了一个 ChannelInterceptor获取一些信息。

@Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {

        registry.addEndpoint("/endpoint1")
                .addInterceptors(new IpHandshakeInterceptor())
                .setAllowedOrigins(origin)
                .withSockJS();

        registry.addEndpoint("/endpoint2")
                .addInterceptors(new IpHandshakeInterceptor())
                .setAllowedOrigins(origin)
                .withSockJS();
        // other andpoint
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(myChannelInterceptor());
    }

所有端点使用 myChannelInterceptor (实际上,我希望端点使用自己的 ChannelInterceptor),我想在 ChannelInterceptor 中做事通过端点路径。

@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
  if (endpoint.equals("endpoint1")) {
  } else if (endpoint.equals("endpoint2")) {
  }
}

我如何获得 endpoint信息在ChannelInterceptor ?

最佳答案

您可以使用:

  • 在 IphandshakeInterceptor 类中将值写入属性映射:
     @Override
     public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
         if (serverHttpRequest instanceof ServletServerHttpRequest) {
             ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) serverHttpRequest;
             HttpSession session = servletRequest.getServletRequest().getSession();
             //add value to session attributes
             map.put("endpoint", servletRequest.getURI().getPath());
         }
         // ... your logic ...
         return true;
     }
    
  • 在您的 myChannelInterceptor 从 session 属性中读取值:
     @Override
     public Message<?> preSend(final Message<?> message, final MessageChannel channel) throws AuthenticationException {
         final StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
         String endpoint=accessor.getSessionAttributes().get("endpoint").toString();
         // ... your logic ...
         return message;
     }
    
  • 关于spring-boot - 如何使用spring boot stomp在ChannelInterceptor中获取端点路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56927830/

    相关文章:

    java - Java Spring 应用程序的巴西时区

    java - 如何在 Spring Boot WebFlux 中使用 GET 请求注销

    java - Spring boot - 如何向应用程序上下文提供环境变量以避免单元测试失败

    java - 单个主题的Spring Kafka多个消费者消费不同的消息

    java - 如何使用@RequestBody 或@RequestParam 接收 json 对象

    stomp - SockJS 从spring websocket 接收stomp 消息乱序

    javascript - 使用 sockjs 和 stomp 在/信息请求期间没有 cookie

    websocket - JMeter WebSockets 发布/订阅 - 脚本异步响应

    java - 通过 Websocket Controller 打印从 Stomp 传入的 json 数组

    spring - 订阅不工作 Spring SockJs Stomp