【问题标题】:Getting uri info from http context of a stomp / spring controller从 stomp / spring 控制器的 http 上下文中获取 uri 信息
【发布时间】:2017-01-24 16:15:49
【问题描述】:

如何访问 spring stomp websocket 控制器中的主机信息。

@Controller
public class EventSessionController 
{
    @Autowired
    ApplicationContext applicationContext;  

    @MessageMapping("/topic/sessionmessages}")  
    public SocketEvent messageHandler((StompHeaderAccessor accessor, SimpMessageHeaderAccessor headerAccessor, MySocketEvent eventMsg)
    {               
        ....// Need to access request uri / host

        // I could access it from headers, but its empty        
        System.out.println(accessor.getHost());

    }
}

我可以尝试注入 MessageHeaderAccessor,但是如何访问 http 请求上下文?

@Configuration
@EnableWebSocketMessageBroker
public class EventSocketServerConfig extends AbstractWebSocketMessageBrokerConfigurer  
{
    @Override
     public void configureClientInboundChannel(ChannelRegistration registration) 
     {
        registration.setInterceptors(new ChannelInterceptorAdapter() 
        {
            @Override
            public Message<?> preSend(Message<?> message, MessageChannel channel) 
            {               
                StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
                accessor.setHost(.......how to get the http host?.......);
            }
        }
    }
}   

【问题讨论】:

    标签: java spring stomp sockjs


    【解决方案1】:

    如果我正确地回答了您的问题,您可能希望访问请求 URI 以从中获取一些参数。

    为此,您可以像下面的示例一样使用 HttpSessionIdHandshakeInterceptor,

    @Configuration
    @EnableWebSocketMessageBroker
    public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    
        protected final Logger log = LoggerFactory.getLogger(WebSocketConfig.class);
    
        @Override
        public void configureMessageBroker(MessageBrokerRegistry config) {
            config.enableSimpleBroker("/topic");
            config.setApplicationDestinationPrefixes("/app");
        }
    
        @Override
        public void registerStompEndpoints(StompEndpointRegistry registry) {
            registry.addEndpoint("/gs-guide-websocket").withSockJS().setInterceptors(httpSessionIdHandshakeInterceptor());
        }
    
        public class HttpSessionIdHandshakeInterceptor implements HandshakeInterceptor {
    
            @Override
            public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,
                    WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
                log.debug("beforeHandshake");
                if (request instanceof ServletServerHttpRequest) {
    
                    ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
    
                    HttpSession session = servletRequest.getServletRequest().getSession(false);
                    // **** This is the request URI **********
                    URI uri = servletRequest.getURI();
    
                }
                return true;
            }
    
            public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
                    Exception ex) {
                log.debug("afterHandshake");
            }
    
        }
    
         @Bean
         public HttpSessionIdHandshakeInterceptor httpSessionIdHandshakeInterceptor() {
          return new HttpSessionIdHandshakeInterceptor();
         }
    
    }
    

    【讨论】:

    • 感谢您的建议,您建议如何将此信息上游发送到 messageHandler?
    • 好的,我想通了,我可以从 StompHeaderAccessor 访问器访问 sessionAttributes。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    相关资源
    最近更新 更多