中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot中如何使用WebSocket實現點對點消息

發布時間:2021-06-15 16:08:11 來源:億速云 閱讀:687 作者:小新 欄目:編程語言

小編給大家分享一下SpringBoot中如何使用WebSocket實現點對點消息,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

Spring 提供了 SimpMessagingTemplate 類來讓開發者更加靈活地發送消息。使用 SimpMessagingTemplate,我們不僅可以在任意地方發送消息到 broker,也可以發送消息給某一個用戶,即點對點的消息發送。

這里我們編寫開發用戶登錄的代碼了,直接使用 Spring Security 的用戶登錄機制和配置用戶。

一、添加依賴,配置

使用 Spring Security 里的用戶。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

我們現在需要配置用戶信息和權限配置。

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    // 指定密碼的加密方式
    @SuppressWarnings("deprecation")
    @Bean
    PasswordEncoder passwordEncoder(){
        // 不對密碼進行加密
        return NoOpPasswordEncoder.getInstance();
    }

    // 配置用戶及其對應的角色
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("admin").password("123").roles("ADMIN","USER")
                .and()
                .withUser("hangge").password("123").roles("USER");
    }

    // 配置 URL 訪問權限
    @Override
    protected  void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests() // 開啟 HttpSecurity 配置
                .anyRequest().authenticated() // 用戶訪問所有地址都必須登錄認證后訪問
                .and().formLogin().permitAll(); // 開啟表單登錄
    }
}

二、編寫WebSocket 配置

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        // 設置消息代理的前綴,如果消息的前綴為"/queue",就會將消息轉發給消息代理(broker)
        // 再由消息代理廣播給當前連接的客戶端
        //也可設置多個 broker,如:config.enableSimpleBroker("/topic","/queue");
        config.enableSimpleBroker("/queue");
        // 下面方法可以配置一個或多個前綴,通過這些前綴過濾出需要被注解方法處理的消息。
        // 例如這里表示前綴為"/app"的destination可以通過@MessageMapping注解的方法處理
        // 而其他 destination(例如"/topic""/queue")將被直接交給 broker 處理
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        // 定義一個前綴為"/chart"的endpoint,并開啟 sockjs 支持。
        // sockjs 可以解決瀏覽器對WebSocket的兼容性問題,客戶端將通過這里配置的URL建立WebSocket連接
        registry.addEndpoint("/chat").withSockJS();
    }

}

三、編寫案例代碼

1、編寫實體

@Data
public class Chat {

    // 消息的目標用戶
    private String to;

    // 消息的來源用戶
    private String from;

    // 消息的主體內容
    private String content;

}

2、編寫Controller

@Controller
public class DemoController {

    @Autowired
    SimpMessagingTemplate messagingTemplate;

    // 處理來自"/app/chat"路徑的消息
    @MessageMapping("/chat")
    public void chat(Principal principal, Chat chat) {
        // 獲取當前登錄用戶的用戶名
        String from = principal.getName();
        // 將用戶設置給chat對象的from屬性
        chat.setFrom(from);
        // 再將消息發送出去,發送的目標用戶就是 chat 對象的to屬性值
        messagingTemplate.convertAndSendToUser(chat.getTo(),
                "/queue/chat", chat);
    }

}

四、編寫頁面

在 resources/static 目錄下創建 chat2.html 頁面作為點對點的聊天頁面。

連接成功后,訂閱的地址為“/user/queue/chat”,該地址比服務端配置的地址多了“/user”前綴,這是因為 SimpMessagingTemplate 類中自動添加了路徑前綴。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>單聊</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/sockjs-client/1.1.2/sockjs.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
    <script>
        var stompClient = null;

        // 建立一個WebSocket連接
        function connect() {
            // 首先使用 SockJS 建立連接
            var socket = new SockJS('/chat');
            // 然后創建一個STOMP實例發起連接請求
            stompClient = Stomp.over(socket);
            // 連接成功回調
            stompClient.connect({}, function (frame) {
                // 訂閱服務端發送回來的消息
                stompClient.subscribe('/user/queue/chat', function (chat) {
                    // 將服務端發送回來的消息展示出來
                    showGreeting(JSON.parse(chat.body));
                });
            });
        }

        // 發送消息
        function sendMsg() {
            stompClient.send("/app/chat", {},
                JSON.stringify({'content':$("#content").val(),
                    'to':$("#to").val()}));
        }

        // 將服務端發送回來的消息展示出來
        function showGreeting(message) {
            $("#chatsContent")
                .append("<div>" + message.from+":"+message.content + "</div>");
        }

        // 頁面加載后進行初始化動作
        $(function () {
            // 頁面加載完畢后自動連接
            connect();
            $( "#send" ).click(function() { sendMsg(); });
        });
    </script>
</head>
<body>
<div id="chat">
    <div id="chatsContent">
    </div>
    <div>
        請輸入聊天內容:
        <input type="text" id="content" placeholder="聊天內容">
        目標用戶:
        <input type="text" id="to" placeholder="目標用戶">
        <button id="send" type="button">發送</button>
    </div>
</div>
</body>
</html>

五、驗證結果

我們使用了 Spring Security 會自動跳轉到默認登錄頁面。

SpringBoot中如何使用WebSocket實現點對點消息

這里我們配置兩個用戶信息:admin/123,piao/123。

SpringBoot中如何使用WebSocket實現點對點消息

SpringBoot中如何使用WebSocket實現點對點消息

以上是“SpringBoot中如何使用WebSocket實現點對點消息”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

富宁县| 台中市| 唐河县| 兰西县| 庄河市| 哈尔滨市| 密山市| 嘉义市| 崇州市| 安徽省| 无锡市| 全州县| 辽中县| 蕲春县| 永登县| 永平县| 龙海市| 黔江区| 崇明县| 邵武市| 潼南县| 南宁市| 龙门县| 兖州市| 富源县| 麻栗坡县| 广南县| 太康县| 株洲县| 濮阳县| 石门县| 漠河县| 镇雄县| 墨脱县| 栖霞市| 集贤县| 华池县| 孟州市| 桂阳县| 临夏市| 金坛市|