成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

spring boot websocket的實現

wuyumin / 3093人閱讀

摘要:子協(xié)議只是一個消息傳遞的體系結構,沒有指定任何的消息傳遞協(xié)議。是一個簡單的消息傳遞協(xié)議,是一種為,面向消息的中間件設計的簡單文本協(xié)議。的實現對內嵌的或者和使用了提供了支持。廣播式廣播式即服務端有消息時,會將消息發(fā)送到所有連接了當前的瀏覽器。

簡單介紹

    WebSocket是為瀏覽器和服務端提供雙工藝部通信功能一種工具,即瀏覽器可以先服務端發(fā)送消息,服務端也可以先瀏覽器發(fā)送消息?,F在支持Websocket的瀏覽器有  IE10+,Crome13+,FileFox6+。

WebSocket子協(xié)議

    WebSocket只是一個消息傳遞的體系結構,沒有指定任何的消息傳遞協(xié)議。與HTTP協(xié)議不同的是,WebSocket只是一個應用層的協(xié)議,它非常簡單,并不能理解傳入的消息,也不能對消息進行路由或處理,因此WebSocket協(xié)議只是一個應用層的協(xié)議,其上需要一個框架來理解和處理消息。

    Spring框架提供了對使用STOMP子協(xié)議的支持。STOMP,全稱Streaming Text Orientated Message Protol,流文本定向協(xié)議。STOMP是一個簡單的消息傳遞協(xié)議,是一種為MOM(Message Orientated  Middleware,面向消息的中間件)設計的簡單文本協(xié)議。STOMP提供了一個可操作的連接格式,允許STOMP客戶端與任意代理(Broker)進行交互,類似于OpenWire(一種二進制協(xié)議)。

    

Spring Boot的WebSocket實現

     SpringBoot對內嵌的Tomcat(7或者8)、Jetty9和Undertow使用了WebSocket提供了支持。

廣播式

廣播式即服務端有消息時,會將消息發(fā)送到所有連接了當前endpoint的瀏覽器。

配置WebSocket

需要在配置類上使用@EnableWebSocketMessageBroker開啟WebSocket支持,并通過集成AbstractWebSocketMessageBrokerConfigurer類,重寫其方法來配置WebSocket。
        

package com.example.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;

/**
 * Created by lenovo on 2017/3/15.
 */
@Configuration
@EnableWebSocketMessageBroker //通過@EnableWebSocketMessageBroker 注解凱旗使用STOMP協(xié)議來傳輸基于代理(message broker)的消息
//這時控制器支持使用@MessageMapping,就像使用@RequestMapping一樣
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer{


    @Override
    public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
        stompEndpointRegistry.addEndpoint("/endpoint").withSockJS();//注冊STOMP協(xié)議的節(jié)點,映射指定的URL,并指定使用SockJS協(xié)議
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {//配置消息代碼(Message Broker)
        registry.enableSimpleBroker("/topic");//廣播式應配置一個/topic消息代理
    }
}

消息的接收器、發(fā)送器和控制器

package com.example.model;

/**
 * Created by lenovo on 2017/3/15.
 */
public class MessageSender {
    private String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public MessageSender(String msg) {
        this.msg = msg;
    }
}
package com.example.model;

import java.io.Serializable;

/**
 * Created by lenovo on 2017/3/15.
 */
public class MessageAcceptor implements Serializable{

    private String msg;

    public String getMsg() {
        return msg;
    }

}
package com.example.websocket;

import com.example.model.MessageAcceptor;
import com.example.model.MessageSender;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * Created by lenovo on 2017/3/15.
 */
@Controller
public class TestWeb {

    @MessageMapping(value = "/message/test")//當瀏覽器向服務端發(fā)送請求時,通過@MessageMapping映射的地址,類似于@RequestMapping
    @SendTo(value = "/topic/response")//當服務端有消息時,會對訂閱了@SendTo中的路徑的瀏覽器發(fā)送消息
    public MessageSender say(MessageAcceptor acceptor){
        return new MessageSender("HELLO!"+acceptor.getMsg());
    }

    @RequestMapping("index")
    public String index(){
        return "index";
    }
}
準備 WebSocket需要的前端文件。

下載stomp.min.js和sockjs.min.js文件,并放在static下,然后在templates下新建index.html頁面

stomp的API參考鏈接:https://segmentfault.com/a/11...




    
    Title


上述代碼都已經準備好了,那么一起來看一看運行效果

如預期一樣,在連接了WebSocket的客戶端發(fā)送消息時,其它同樣連接了WebSocket的客戶端瀏覽器也收到了消息,沒有連接WebSocket的客戶端則沒有收到消息

看完了代碼和代碼的運行效果,我們再來看一看WebSocket運行中STOMP的幀
連接STOMP服務端幀:CONNECT?accept-version:1.1,1.0?heart-beat:10000,10000 

連接STOMP服務端成功幀:CONNECTED?version:1.1?heart-beat:0,0 

訂閱目標/topic/response:SUBSCRIBE?id:sub-0?destination:/topic/response 

向目標/message/test發(fā)送消息:SEND?destination:/message/test?content-length:16??{"msg":"測試"} 

從目標/topic/response接收到消息:MESSAGE?destination:/topic/response?content-type:application/json;charset=UTF-8?subscription:sub-0?message-id:hstpp2xl-0?content-length:22??{"msg":"HELLO!測試"} 
點對點式

廣播式有自己的應用場景,但是廣播式不能解決我們我們一個常見的問題,即消息由誰發(fā)送,由誰接受的問題。

1.在進行點對點傳遞消息的時候,必然發(fā)生在兩個用戶之間的行為,那么就需要添加用戶相關的內容,在這里先完成一個簡單的登陸。

首先添加Spring Security的starter pom:    

        
            org.springframework.boot
            spring-boot-starter-security
        

2.然后進行spring security的簡單配置

  

package com.example.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * Created by lenovo on 2017/3/17.
 */
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 權限管理配置構造器
     *
     * @param auth 權限管理
     * @throws Exception
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //配置了兩個用戶和對應的密碼,并且申明了他們的角色
        auth.inMemoryAuthentication().withUser("muxiao").password("123456").roles("USER")
                .and().withUser("hahaha").password("123456").roles("USER");//在內存中分別配置兩個用戶muxiao和hahaha
    }

    /**
     * Web安全配置
     * @param web
     * @throws Exception
     */
    @Override
    public void configure(WebSecurity web) throws Exception {
        //靜態(tài)資源不做安全校驗
        web.ignoring().antMatchers("/resources/static/**");///resources/static/目錄下的靜態(tài)資源,不攔截
    }

    /**
     * 配置http安全
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //簡單的配置運行點對點所需要的登陸權限
        http.authorizeRequests()
                .antMatchers("/","login").permitAll()//設置Spring Security對/和/login路徑不攔截
                .anyRequest().authenticated()
                .and().formLogin().loginPage("/login")//設置登錄頁面訪問的路徑為/login
                .defaultSuccessUrl("/chat").permitAll()//登陸成功后轉向chat頁面
                .and().logout().permitAll();
    }
}
        然后在TestWeb中增加一個MessageMapping接口:

  

  @Autowired private SimpMessagingTemplate messagingTemplate;//spring實現的一個發(fā)送模板類 

    @MessageMapping("/chat")
    public void handlerChat(Principal principal, String msg) {//springmvc中可以直接在參數中獲得pricipal,pricipal中包含當前永不的信息
        if (principal.getName().equalsIgnoreCase("muxiao")) {
            messagingTemplate.convertAndSendToUser("hahaha","/queue/notice",principal.getName()+":"+msg);
        } else {
            messagingTemplate.convertAndSendToUser("muxiao","/queue/notice",principal.getName()+":"+msg);
            //通過messaginTemplate.converAndSendTiUser向用戶發(fā)送消息,第一次參數是接受信息的用戶,第二個是瀏覽器訂閱的地址,第三個是消息本身
        }
    }

3.同時定義需要的頁面訪問路徑:

package com.example.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * Created by lenovo on 2017/3/17.
 */
@Configuration
public class WebViewConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/chat").setViewName("/chat");
        registry.addViewController("/login").setViewName("/login");
    }
}

4.我們已經準備好了所需要的后臺,這時候就開始實現我們需要的功能的前端編寫了。

首先,實現登陸頁面,在瀏覽器中訪問除過"/","/index"之外的其它頁面,都會來到login頁面以進行登陸,即下面的頁面:




    
    Title


             輸入我們在內存中指定的用戶名和密碼,登陸進入chat頁面 Title

同時在兩個瀏覽器上面,用在內存中指定的兩個用戶登陸,這樣兩個用戶就可以互相發(fā)送消息了,延時效果如下:

            

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/89910.html

相關文章

  • [直播視頻] 《Java 微服務實踐 - Spring Boot 系列》限時折扣

    摘要:作為微服務的基礎設施之一,背靠強大的生態(tài)社區(qū),支撐技術體系。微服務實踐為系列講座,專題直播節(jié),時長高達小時,包括目前最流行技術,深入源碼分析,授人以漁的方式,幫助初學者深入淺出地掌握,為高階從業(yè)人員拋磚引玉。 簡介 目前業(yè)界最流行的微服務架構正在或者已被各種規(guī)模的互聯(lián)網公司廣泛接受和認可,業(yè)已成為互聯(lián)網開發(fā)人員必備技術。無論是互聯(lián)網、云計算還是大數據,Java平臺已成為全棧的生態(tài)體系,...

    Enlightenment 評論0 收藏0
  • Spring Boot 2.x 系列教程:WebFlux 系列教程大綱(一)

    摘要:使用則需要及以上版本。開發(fā)使用框架七系列教程目錄系列教程大綱快速入門實踐實踐整合整合中和實踐整合中實現緩存中實現通信集成測試及部署實戰(zhàn)圖書管理系統(tǒng) WebFlux 系列教程大綱 一、背景 大家都知道,Spring Framework 是 Java/Spring 應用程序跨平臺開發(fā)框架,也是 Java EE(Java Enterprise Edition) 輕量級框架,其 Spring ...

    jone5679 評論0 收藏0
  • 兩年了,我寫了這些干貨!

    摘要:開公眾號差不多兩年了,有不少原創(chuàng)教程,當原創(chuàng)越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章系列處理登錄請求前后端分離一使用完美處理權限問題前后端分離二使用完美處理權限問題前后端分離三中密碼加鹽與中異常統(tǒng)一處理 開公眾號差不多兩年了,有不少原創(chuàng)教程,當原創(chuàng)越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章! Spring Boo...

    huayeluoliuhen 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<