2015-06-14 106 views
1

有沒有什麼辦法在Spring中攔截STOMP CONNECT幀並在某些情況下拒絕它? 截取本身可以使用SessionConnectEvent完成,但我想允許或拒絕基於標頭的連接。我無法在SessionConnectEvent監聽器中執行此操作。Spring Websocket Stomp handle CONNECT frame

回答

2

如果我們看一看到StompSubProtocolHandler代碼,我們會看到這一點:

try { 
    SimpAttributesContextHolder.setAttributesFromMessage(message); 
    if (this.eventPublisher != null) { 
     if (StompCommand.CONNECT.equals(headerAccessor.getCommand())) { 
      publishEvent(new SessionConnectEvent(this, message, user)); 
     } 
........ 
    outputChannel.send(message); 
} 

所以,CONNECT框架不僅發出爲SessionConnectEvent,而是被送到clientInboundChannel爲好。

所以,你需要達到你的要求是提供一個自定義的ChannelInterceptorpreSend實現並註冊它覆蓋WebSocketMessageBrokerConfigurer.configureClientInboundChannel

+0

我已經嘗試過'ChannelInterceptor',但它看起來像'CONNECT'框架沒有被攔截...可能我做錯了什麼。我在閱讀你的答案之後再次嘗試,並且工作。謝謝。我不喜歡'ChannelInterceptor'的唯一原因是它在每一幀都被調用,而我只需要攔截'CONNECT'幀。無論如何,解決方案符合我的要求。 – Damian