Contoh Cepat Anotasi @SendToUser Spring Websockets

1. Ikhtisar

Dalam tutorial singkat ini, kami akan mengilustrasikan cara mengirim pesan ke sesi tertentu atau pengguna tertentu menggunakan Spring WebSockets .

Untuk pengantar modul di atas, silakan merujuk ke artikel ini.

2. Konfigurasi WebSocket

Pertama-tama, kita perlu mengkonfigurasi broker pesan dan titik akhir aplikasi WebSocket :

@Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic/", "/queue/"); config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/greeting"); } }

Dengan @EnableWebSocketMessageBroker, kami mengaktifkan perpesanan yang didukung broker melalui WebSocket menggunakan STOMP , yang merupakan singkatan dari Streaming Text Oriented Messaging Protocol. Penting untuk diperhatikan bahwa anotasi ini perlu digunakan bersama dengan @Configuration .

Tidak wajib memperluas AbstractWebSocketMessageBrokerConfigurer tetapi, untuk contoh cepat, lebih mudah menyesuaikan konfigurasi yang diimpor.

Dalam metode pertama, kami menyiapkan broker pesan berbasis memori sederhana untuk membawa pesan kembali ke klien pada tujuan yang diawali dengan "/ topic" dan "/ queue" .

Dan, yang kedua, kami mendaftarkan titik akhir stomp di "/ salam" .

Jika kami ingin mengaktifkan SockJS, kami harus mengubah bagian register:

registry.addEndpoint("/greeting").withSockJS();

3. Dapatkan ID Sesi dengan Interceptor

Salah satu cara untuk mendapatkan session id adalah menambahkan Spring Interceptor yang akan terpicu selama jabat tangan dan mendapatkan informasi dari data permintaan.

Pencegat ini dapat ditambahkan langsung di WebSocketConfig:

@Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry .addEndpoint("/greeting") .setHandshakeHandler(new DefaultHandshakeHandler() { public boolean beforeHandshake( ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws Exception { if (request instanceof ServletServerHttpRequest) { ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; HttpSession session = servletRequest .getServletRequest().getSession(); attributes.put("sessionId", session.getId()); } return true; }}).withSockJS(); }

4. Titik Akhir WebSocket

Dimulai dengan Spring 5.0.5.RELEASE, tidak perlu melakukan penyesuaian apa pun karena peningkatan anotasi @SendToUser , yang memungkinkan kami mengirim pesan ke tujuan pengguna melalui " / user / {sessionId} / ... " daripada “ / pengguna / {pengguna} /… “.

Itu berarti anotasi bekerja dengan mengandalkan id sesi dari pesan masukan, secara efektif mengirimkan balasan ke tujuan pribadi ke sesi:

@Controller public class WebSocketController { @Autowired private SimpMessageSendingOperations messagingTemplate; private Gson gson = new Gson(); @MessageMapping("/message") @SendToUser("/queue/reply") public String processMessageFromClient( @Payload String message, Principal principal) throws Exception { return gson .fromJson(message, Map.class) .get("name").toString(); } @MessageExceptionHandler @SendToUser("/queue/errors") public String handleException(Throwable exception) { return exception.getMessage(); } }

Penting untuk diperhatikan bahwa, @SendToUser menunjukkan bahwa nilai kembalian dari metode penanganan pesan harus dikirim sebagai Pesan ke tujuan yang ditentukan diawali dengan " / user / {username} " .

5. Klien WebSocket

function connect() { var socket = new WebSocket('ws://localhost:8080/greeting'); ws = Stomp.over(socket); ws.connect({}, function(frame) { ws.subscribe("/user/queue/errors", function(message) { alert("Error " + message.body); }); ws.subscribe("/user/queue/reply", function(message) { alert("Message " + message.body); }); }, function(error) { alert("STOMP error " + error); }); } function disconnect() { if (ws != null) { ws.close(); } setConnected(false); console.log("Disconnected"); }

WebSocket baru dibuat dengan menunjuk ke " / salam " untuk pemetaan di WebSocketConfiguration .

Ketika kita mendaftarkan klien ke " / user / queue / error " dan " / user / queue / reply " adalah tempat kita menggunakan informasi yang disebutkan dari bagian terakhir.

Seperti yang kita lihat, @SendToUser menunjuk ke " antrian / kesalahan " tetapi pesan akan dikirim ke " / pengguna / antrian / kesalahan ".

6. Kesimpulan

Pada artikel ini, kami telah menjelajahi cara untuk mengirim pesan langsung ke pengguna atau id sesi dengan Spring WebSocket

Seperti biasa, kode sumber lengkap dari contoh tersedia di GitHub.