2015-02-16 9 views
8

मैंने काफी खोज की है और इसे खोजने में असमर्थ रहा है: क्या कोई तरीका है कि एक वसंत websocket stomp सर्वर sessionId (या वास्तव में किसी भी चीज़ पर आधारित क्लाइंट को डिस्कनेक्ट कर सकता है) सब)?स्प्रिंग वेबस्केट स्टॉम्प सर्वर से क्लाइंट सत्र डिस्कनेक्ट करें

ऐसा लगता है कि एक बार जब ग्राहक किसी सर्वर से कनेक्ट होता है तो ऐसा कुछ भी नहीं है जो सर्वर को क्लाइंट को डिस्कनेक्ट करने की अनुमति देता है।

उत्तर

1

जहां तक ​​मुझे पता है कि एपीआई आपको जो भी ढूंढ रहा है वह प्रदान नहीं करता है, सर्वर-साइड पर आप केवल डिस्कनेक्ट ईवेंट का पता लगा सकते हैं। यदि आप किसी निश्चित ग्राहक को डिस्कनेक्ट करना चाहते हैं तो मुझे लगता है कि आपको एक लिट वर्कअराउंड के लिए जाना होगा, उदा। इस एक:

  1. एक क्लाइंट-साइड जावास्क्रिप्ट समारोह जैसे ही आपका क्लाइंट सर्वर से जुड़ा है एक डिस्कनेक्ट
  2. को गति प्रदान करने में सक्षम है कि लिखें, आपकी जावास्क्रिप्ट में एक ग्राहक आईडी पैदा करते हैं और सर्वर के लिए भेज । क्लाइंट पर आईडी याद रखें, आपको इसे चरण (4) में चाहिए।
  3. उस समय जब आप सर्वर को विशिष्ट क्लाइंट (आईडी द्वारा पहचाना गया) से कनेक्शन को डिस्कनेक्ट करना चाहते हैं, तो क्लाइंट को आईडी युक्त एक संदेश भेजें।
  4. अब आपका क्लाइंट जावास्क्रिप्ट सर्वर से भेजे गए संदेश का मूल्यांकन करता है और चरण (1) में आपके द्वारा लिखे गए डिस्कनेक्ट फ़ंक्शन को कॉल करने का निर्णय लेता है।
  5. आपका ग्राहक स्वयं डिस्कनेक्ट हो जाता है।

कामकाज थोड़ा बोझिल है लेकिन यह काम करेगा।

+1

दुर्भाग्य से यह मानता है कि ग्राहक डिस्कनेक्ट संदेश के अनुरूप है। आखिरकार मैं नहीं चाहता कि ग्राहक इसमें कहें। उत्तर के रूप में चिह्नित करना क्योंकि ऐसा प्रतीत नहीं होता है कि यह संभव है। – user1751547

+1

'SubProtocolWebSocketHandler.java' के बाद कोडकनेशन() 'विधि के स्रोत कोड के अनुसार, आप पढ़ सकते हैं: ' // WebSocketHandlerDecorator सत्र बंद कर सकता है' –

8

वास्तव में कुछ कामकाज का उपयोग करके आप जो चाहते हैं उसे प्राप्त कर सकते हैं। कि के लिए आपको क्या करना चाहिए:

  1. उपयोग जावा विन्यास (यकीन नहीं अगर यह एक्सएमएल config के साथ संभव है)
  2. WebSocketMessageBrokerConfigurationSupport से अपने config वर्ग का विस्तार और WebSocketMessageBrokerConfigurer लागू इंटरफ़ेस
  3. कस्टम उप बनाएं -प्रोटोकॉल वेबसाइकिल हैंडलर और इसे से बढ़ाएं SubProtocolWebSocketHandler कक्षा
  4. अपने कस्टम उप-प्रोटोकॉल websoc में ket हैंडलर ओवरराइड afterConnectionEstablished विधि और आप को दिखाने के लिए कि कैसे हम सर्वर साइड से ग्राहक सत्र डिस्कनेक्ट कर सकते हैं WebSocketSession :)

मेरे द्वारा बनाए गए नमूना वसंत-बूट परियोजना के लिए उपयोग होगा: https://github.com/isaranchuk/spring-websocket-disconnect

+0

यह प्रतिक्रिया स्वीकार की जानी चाहिए, यह ग्राहक सहयोग के बिना काम करता है –

2

आप यह भी एक कस्टम WebSocketHandlerDecorator को लागू करने से सत्र बाधित कर सकते हैं:

@Configuration 
@EnableWebSocketMessageBroker 
public class WebSocketConfig<S extends ExpiringSession> extends AbstractSessionWebSocketMessageBrokerConfigurer<S> { 

    @Override 
    public void configureWebSocketTransport(final WebSocketTransportRegistration registration) { 
     registration.addDecoratorFactory(new WebSocketHandlerDecoratorFactory() { 
      @Override 
      public WebSocketHandler decorate(final WebSocketHandler handler) { 
       return new WebSocketHandlerDecorator(handler) { 
        @Override 
        public void afterConnectionEstablished(final WebSocketSession session) throws Exception { 

         session.close(CloseStatus.NOT_ACCEPTABLE); 
         super.afterConnectionEstablished(session); 
        } 
       }; 
      } 
     }); 
     super.configureWebSocketTransport(registration); 
    } 


    @Override 
    protected void configureStompEndpoints(final StompEndpointRegistry registry) { 
    registry.addEndpoint("/home") 
      .setHandshakeHandler(new DefaultHandshakeHandler(
        new UndertowRequestUpgradeStrategy() // If you use undertow 
        // new JettyRequestUpgradeStrategy() 
        // new TomcatRequestUpgradeStrategy() 
      )) 
      .withSockJS(); 
    } 
} 
संबंधित मुद्दे