Baru -baru ini, ketika mempelajari Spring Websocket, saya menulis kode sesuai dengan contoh di musim semi yang sedang beraksi, dan browser melaporkan kesalahan 404 saat runtime.
Koneksi Websocket ke 'WS: // LocalHost/Websocket/Marco' Gagal: Kesalahan selama Websocket Handshake: Kode Respons Tak Terduga: 404
Ikuti langkah -langkah di musim semi beraksi:
Pertama, mewarisi AbstractWebsockethandler dan membebani 3 metode berikut:
- HandleTlexTmessage menangani pesan jenis teks
- afterconnectionestable dipanggil setelah koneksi baru dibuat
- Panggilan afterconnectionsclosed setelah koneksi ditutup
Impor org.springframework.web.socket.closestatus; impor org.springframework.web.socket.textmessage; impor org.springframework.web.socket.handler. {Protected void handleTextMessage (sesi WebSocketsession, pesan TextMessage) melempar Exception {System.out.println ("Pesan diterima:" + pesan.getPayload ()); Thread.sleep (2000); session.sendMessage (TextMessage baru ("Polo!")); } @Override public void afterconnectionestablished (Sesi WebSocketsession) {System.out.println ("Koneksi didirikan!"); } @Override public void afterconnectionclosed (Sesi WebSocketsession, status terdekat) {System.out.println ("Koneksi ditutup. Status:" + Status); }}Kedua, aktifkan prosesor WebSocket dan peta pesan menggunakan javaconfig
impor org.springframework.context.annotation.bean; impor org.springframework.web.socket.config.annotation.enableWebsocket; impor org.springframework.web.socket.config.annotation.websockonFigurer; org.springframework.web.socket.config.annotation.websockethandlerregistry; @EnableWebsocketpublic kelas WebSocketConfigurer/mengimplementasikan WebSocketConfigurer {@Override public void (REGREFIRNDER (REGISTRY "WEBSOCKETHETHANDLREGORSI {@Override {Registry (Registry) {{Registry (Registry) {Registry (Registry) {Registry) {{UDADLREKS) {{UDACKETHANDER (REGISTRI (REGISTRIS) {UDADREKS) } @Bean public marcoHandler marcoHandler () {return new marcoHandler (); }}Akhirnya, tulis kode JS front-end untuk memulai permintaan koneksi dan interaksi pesan selanjutnya
var url = 'ws: //' + window.location.host + '/websocket/marco'; var sock = websocket baru (url); sock.onopen = function () {console.log ('opening'); sock.send ('marco!');}; sock.onmessage = function (e) {console.log ('Pesan diterima:', e.data); setTimeout (function () {SayMarco ()}, 2000);}; sock.onclose = function () {console.log ('penutupan');}; function SayMarco () {console.log ('Sending marco!'); sock.send ('marco!');}Setelah penempatan, buka browser dan jalankan, dan langsung melaporkan kesalahan 404
Mencari di internet untuk solusi malam, termasuk pengalaman di stackoverflow.com, tidak menyelesaikan masalah sampai saya melihat artikel berikut:
Solusi untuk mengakses Halaman Websocket Terpadu 404 Masalah
Mari kita buat catatan di sini untuk menghindari lupa nanti.
Websocket pada dasarnya meminjam permintaan HTTP untuk berjabat tangan. Untuk mengaktifkan Spring Websocket, Anda perlu mengonfigurasi intersepsi permintaan ini di org.springframework.web.servlet.dispatcherServlet.
Inilah solusinya:
Pertama, memodifikasi definisi kelas WebSocketConfig dan menambahkan anotasi @Configuration ke kelas, menunjukkan bahwa kelas digunakan sebagai sumber definisi kacang dalam bentuk javaconfig (setara dengan elemen <Bac> dalam konfigurasi XML).
Impor org.springframework.context.annotation.bean; impor org.springframework.context.annotation.onfigurasi; impor org.springframework.web.socket.config.annotation.enableWebsocket; orgorconcon.weBramework.weBB.socketation. org.springframework.web.socket.config.annotation.websockethandlerregistry;@configuration@enableWebsocketpublic kelas WebSocketConfig mengimplementasikan WebSocketConfigurer {@Override public. } @Bean public marcoHandler marcoHandler () {return new marcoHandler (); }} Kedua, gunakan javaconfig untuk mengonfigurasi DispatcherServlet, warisan org.springframework.web.servlet.support.AbstractannotationConfigDispatcherServletInitializer, dan kelebihan 3 metode berikut:
- GetRootConfigClasses Mengembalikan kelas dengan anotasi @configuration untuk mengonfigurasi kacang dalam konteks aplikasi yang dibuat oleh ContextLoaderListener
- GetServletConfigClasses Mengembalikan kelas dengan anotasi @Configuration untuk mendefinisikan kacang dalam konteks aplikasi DispatcherServlet
- GetServletmappings memetakan satu atau lebih jalur ke DispatcherServlet
Faktanya, jika Anda hanya perlu Spring Websocket untuk berlaku, Anda hanya perlu mengembalikan kacang dalam metode GetServletConfigClasses yang mendefinisikan konteks aplikasi DispatcherServlet.
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;public class WebSocketInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return null; } @Override Class Protected <?> [] GetSerVletConfigClasses () {return class baru <?> [] {WebSocketConfig.class}; } @Override Protected String [] getServerMappings () {return new string [] {"/"}; }}Redeploy Keturunan dan buka browser dengan sukses
Pesan klien
Pesan server
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.