最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring配置websocket的完整流程

 更新時(shí)間:2025年05月23日 10:43:01   作者:LCY133  
websocket為瀏覽器為服務(wù)器提供了雙工異步通信的功能,即瀏覽器可以向服務(wù)器發(fā)送消息,服務(wù)器也可以向?yàn)g覽器發(fā)送消息,這篇文章主要給大家介紹了關(guān)于spring配置websocket的相關(guān)資料,需要的朋友可以參考下

在 Spring Boot 中使用 Kotlin 配置 WebSocket 的完整流程如下(包含基礎(chǔ)配置、安全增強(qiáng)和性能優(yōu)化):

一、添加依賴 (build.gradle.kts 或 pom.xml)

// build.gradle.kts
dependencies {
    implementation("org.springframework.boot:spring-boot-starter-websocket")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin") // JSON 支持
}

二、基礎(chǔ) WebSocket 配置

1. 啟用 WebSocket 支持

@Configuration
@EnableWebSocket
class WebSocketConfig : WebSocketConfigurer {

    @Autowired
    lateinit var myWebSocketHandler: MyWebSocketHandler

    @Autowired
    lateinit var handshakeInterceptor: AuthHandshakeInterceptor

    override fun registerWebSocketHandlers(registry: WebSocketHandlerRegistry) {
        registry.addHandler(myWebSocketHandler, "/ws")
            .addInterceptors(handshakeInterceptor)
            .setAllowedOrigins("*") // 生產(chǎn)環(huán)境應(yīng)限制域名
    }
}

三、核心組件實(shí)現(xiàn)

1. WebSocket 消息處理器

@Component
class MyWebSocketHandler : TextWebSocketHandler() {

    private val sessions = ConcurrentHashMap<String, WebSocketSession>()
    private val logger = LoggerFactory.getLogger(this::class.java)

    // 連接建立
    override fun afterConnectionEstablished(session: WebSocketSession) {
        val userId = session.attributes["userId"] as? String
        userId?.let {
            sessions[it] = session
            logger.info("User $it connected, total: ${sessions.size}")
        } ?: run {
            session.close(CloseStatus.BAD_DATA)
        }
    }

    // 處理文本消息
    override fun handleTextMessage(session: WebSocketSession, message: TextMessage) {
        val payload = message.payload
        logger.debug("Received message: $payload")
        
        // 示例:廣播消息
        sessions.values.forEach { 
            it.sendMessage(TextMessage("Broadcast: $payload"))
        }
    }

    // 連接關(guān)閉
    override fun afterConnectionClosed(session: WebSocketSession, status: CloseStatus) {
        sessions.values.remove(session)
        logger.info("Connection closed: ${status.reason}")
    }

    // 主動(dòng)推送方法
    fun sendToUser(userId: String, message: String) {
        sessions[userId]?.sendMessage(TextMessage(message))
    }
}

2. 握手?jǐn)r截器(安全校驗(yàn))

@Component
class AuthHandshakeInterceptor : HandshakeInterceptor {

    override fun beforeHandshake(
        request: ServerHttpRequest,
        response: ServerHttpResponse,
        wsHandler: WebSocketHandler,
        attributes: MutableMap<String, Any>
    ): Boolean {
        // 1. 校驗(yàn) Token
        val token = request.uri.query?.split("token=")?.get(1)
        if (!validateToken(token)) {
            response.statusCode = HttpStatus.UNAUTHORIZED
            return false
        }

        // 2. 獲取用戶信息
        val userId = parseUserIdFromToken(token)
        attributes["userId"] = userId
        
        // 3. 記錄握手日志
        logHandshake(request.remoteAddress?.hostName)
        return true
    }

    private fun validateToken(token: String?): Boolean {
        // 實(shí)現(xiàn) JWT 校驗(yàn)邏輯
        return token?.startsWith("valid_") == true
    }
}

四、客戶端連接示例(JavaScript + Kotlin)

1. Web 前端連接

const socket = new WebSocket(`ws://${location.host}/ws?token=valid_123`);

socket.onmessage = (event) => {
  console.log('Received:', event.data);
};

// 發(fā)送心跳包保持連接
setInterval(() => {
  socket.send(JSON.stringify({ type: "heartbeat" }));
}, 30000);

2. Android 客戶端(Kotlin)

class WebSocketClient(url: String) : WebSocketListener() {
    private val client = OkHttpClient()
    private var ws: WebSocket? = null

    init {
        val request = Request.Builder().url(url).build()
        ws = client.newWebSocket(request, this)
    }

    override fun onMessage(webSocket: WebSocket, text: String) {
        println("Received: $text")
    }

    fun sendMessage(msg: String) {
        ws?.send(msg)
    }
}

五、高級(jí)配置

1. 消息壓縮配置

@Bean
fun webSocketContainer(): ServletServerContainerFactoryBean {
    return ServletServerContainerFactoryBean().apply {
        setMaxTextMessageBufferSize(8192)
        setMaxBinaryMessageBufferSize(8192)
        setAsyncSendTimeout(30000L) // 30秒異步發(fā)送超時(shí)
    }
}

2. 集群支持(Redis 廣播)

@Configuration
@EnableRedisRepositories
class RedisPubSubConfig {

    @Bean
    fun redisTemplate(connectionFactory: RedisConnectionFactory): RedisTemplate<String, String> {
        return RedisTemplate<String, String>().apply {
            setConnectionFactory(connectionFactory)
        }
    }

    @Bean
    fun topicListenerAdapter(handler: MessageListener): ChannelTopic {
        return ChannelTopic("websocket-messages")
    }
}

六、監(jiān)控與調(diào)試

1. 端點(diǎn)監(jiān)控

@RestController
class WebSocketMetricsController(
    private val handler: MyWebSocketHandler
) {

    @GetMapping("/metrics/websocket")
    fun getMetrics(): Map<String, Any> {
        return mapOf(
            "activeConnections" to handler.getSessionCount(),
            "lastMessageTime" to handler.getLastActivity()
        )
    }
}

2. 日志配置 (logback-spring.xml)

<logger name="org.springframework.web.socket" level="DEBUG"/>
<logger name="com.example.websocket" level="TRACE"/>

七、常見問題解決方案

問題現(xiàn)象解決方案
連接頻繁斷開添加心跳機(jī)制,調(diào)整 setAsyncSendTimeout
跨域失敗精確配置 .setAllowedOrigins("https://your-domain.com")
消息順序錯(cuò)亂使用 @SendToUser(destination = "/queue", broadcast = false) 點(diǎn)對(duì)點(diǎn)發(fā)送
內(nèi)存泄漏定期檢查 sessions Map,添加連接超時(shí)清理邏輯
高并發(fā)時(shí)性能下降啟用異步消息處理,使用 Redis Pub/Sub 分流消息

八、安全增強(qiáng)建議

  • 啟用 WSS 協(xié)議

    # Nginx 配置示例
    location /ws {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_ssl_protocols TLSv1.2 TLSv1.3;
    }
    
  • 限流防護(hù)

    @Bean
    fun webSocketRateLimiter(): WebSocketHandlerDecoratorFactory {
        return object : WebSocketHandlerDecoratorFactory {
            override fun decorate(handler: WebSocketHandler): WebSocketHandler {
                val rateLimiter = RateLimiter.create(100) // 100次/秒
                return object : WebSocketHandlerDecorator(handler) {
                    override fun handleMessage(session: WebSocketSession, message: WebSocketMessage<*>) {
                        if (!rateLimiter.tryAcquire()) {
                            session.close(CloseStatus.POLICY_VIOLATION)
                            return
                        }
                        super.handleMessage(session, message)
                    }
                }
            }
        }
    }
    

九、性能測(cè)試建議

  • 使用 JMeter 壓測(cè)

    <!-- WebSocket 壓測(cè)計(jì)劃示例 -->
    <WebSocketSampler>
      <connectTime>5000</connectTime>
      <responseTimeout>10000</responseTimeout>
      <payload>{ "type": "stress", "data": "test" }</payload>
    </WebSocketSampler>
    
  • 監(jiān)控指標(biāo)
    • 單節(jié)點(diǎn)最大連接數(shù)
    • 消息往返延遲 (RTT)
    • 內(nèi)存占用增長(zhǎng)率

通過以上配置,可以實(shí)現(xiàn)一個(gè)高性能、安全可靠的企業(yè)級(jí) WebSocket 服務(wù),支持從開發(fā)到生產(chǎn)的全生命周期管理。

總結(jié)

到此這篇關(guān)于spring配置websocket的文章就介紹到這了,更多相關(guān)spring配置websocket內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Struts2開發(fā) 基本配置與類型轉(zhuǎn)換

    Struts2開發(fā) 基本配置與類型轉(zhuǎn)換

    本篇文章,小編將為大家介紹關(guān)于Struts2開發(fā) 基本配置與類型轉(zhuǎn)換,有需要的朋友可以參考一下
    2013-04-04
  • 帶你了解JAVA中的一些鎖概念

    帶你了解JAVA中的一些鎖概念

    今天小編就為大家分享一篇關(guān)于Java分布式鎖的概念與實(shí)現(xiàn)方式詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2021-08-08
  • spring中FactoryBean中的getObject()方法實(shí)例解析

    spring中FactoryBean中的getObject()方法實(shí)例解析

    這篇文章主要介紹了spring中FactoryBean中的getObject()方法實(shí)例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Java線程運(yùn)行的原理詳解

    Java線程運(yùn)行的原理詳解

    這篇文章主要為大家詳細(xì)介紹了Java線程運(yùn)行的原理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Java解除文件占用即Dom4j操作后實(shí)現(xiàn)xml關(guān)流

    Java解除文件占用即Dom4j操作后實(shí)現(xiàn)xml關(guān)流

    這篇文章主要介紹了Java解除文件占用即Dom4j操作后實(shí)現(xiàn)xml關(guān)流,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 一文解析Java如何連接FTP服務(wù)器

    一文解析Java如何連接FTP服務(wù)器

    Java 提供了強(qiáng)大的工具和庫(kù)來實(shí)現(xiàn)與 FTP 服務(wù)器的連接、文件傳輸、目錄操作等功能,本文將詳細(xì)介紹如何使用 Java 連接 FTP 服務(wù)器,需要的可以參考下
    2024-12-12
  • springcloud整合gateway實(shí)現(xiàn)網(wǎng)關(guān)的示例代碼

    springcloud整合gateway實(shí)現(xiàn)網(wǎng)關(guān)的示例代碼

    本文主要介紹了springcloud整合gateway實(shí)現(xiàn)網(wǎng)關(guān)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • java獲取json中的全部鍵值對(duì)實(shí)例

    java獲取json中的全部鍵值對(duì)實(shí)例

    下面小編就為大家分享一篇java獲取json中的全部鍵值對(duì)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • SpringBoot+MinIO實(shí)現(xiàn)對(duì)象存儲(chǔ)的示例詳解

    SpringBoot+MinIO實(shí)現(xiàn)對(duì)象存儲(chǔ)的示例詳解

    MinIO?是一個(gè)基于Apache?License?v2.0開源協(xié)議的對(duì)象存儲(chǔ)服務(wù),它是一個(gè)非常輕量的服務(wù),可以很簡(jiǎn)單的和其他應(yīng)用的結(jié)合,所以下面我們就來看看SpringBoot如何整合MinIO實(shí)現(xiàn)對(duì)象存儲(chǔ)吧
    2023-10-10
  • Java自動(dòng)化讀取Excel文件(XLS/XLSX)的完整指南

    Java自動(dòng)化讀取Excel文件(XLS/XLSX)的完整指南

    這篇文章詳細(xì)介紹了如何使用該庫(kù)讀取XLS和XLSX格式的Excel文件,包括提取單元格數(shù)據(jù)、公式計(jì)算結(jié)果以及圖像等內(nèi)容,希望可以幫助大家快速實(shí)現(xiàn)Excel文檔的自動(dòng)化處理與集成
    2025-09-09

最新評(píng)論

罗甸县| 额敏县| 渭源县| 新绛县| 顺昌县| 廉江市| 兴宁市| 仙桃市| 博白县| 惠州市| 安岳县| 龙里县| 涪陵区| 神农架林区| 牙克石市| 东乌| 达拉特旗| 宣城市| 湘乡市| 铜川市| 五峰| 会理县| 吉水县| 宝应县| 航空| 渝中区| 四会市| 时尚| 德阳市| 罗源县| 浮山县| 怀集县| 丰县| 巴林右旗| 高尔夫| 宁都县| 北京市| 塔河县| 安顺市| 土默特右旗| 自治县|