Получение информации uri из http-контекста контроллера stomp/spring

Как получить доступ к информации о хосте внутри контроллера websocket spring stomp.

@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?.......);
            }
        }
    }
}   

person virtuvious    schedule 24.01.2017    source источник


Ответы (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();
     }

}
person Amr K. Ismail    schedule 26.01.2017
comment
Спасибо за предложение, как бы вы предложили отправить эту информацию вверх по течению в messageHandler? - person virtuvious; 26.01.2017
comment
Хорошо, я понял эту часть, я могу получить доступ к sessionAttributes из средства доступа StompHeaderAccessor. - person virtuvious; 26.01.2017