基於springboot @EnableWebSocket 註解完成基本的socket通信以及socket握手權限

基於spring boot 完成客戶端實時通信,此處對整體流程做了簡要實現,下一篇講在此業務上實現通信優化

不涉及socket存儲處理以及發送的邏輯代碼

首先添加pom 依賴

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

然後添加 @EnableWebSocket 註解 設置socket服務註冊


@Configuration
@EnableWebSocket
public class WebSocketHandShakeConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {

//註冊通信接口
    @Autowired
    private WebSocketController testWebSocketController;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
//註冊socket地址,以及允許所有請求  以及攔截器驗證權限
        registry.addHandler(testWebSocketController, "/socketserver")
                .addInterceptors(new HandShakeInterceptor()).setAllowedOrigins("*");
    }

}

實現通信接口

@RestController
public class WebSocketController extends TextWebSocketHandler {

   

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        log.info("WebSocket服務端連接: "+session.getAttributes().get("token")+"===>");
       
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        log.info("WebSocket服務端關閉: 關閉連接狀態: "+status);
      
	  //socket關閉處理業務邏輯;
        closeSession(getToken(session));
    }

    @Override
    public void handleMessage(WebSocketSession wsSession, WebSocketMessage<?> message) throws Exception {
        log.info("WebSocket服務端接受:接受來自客戶端發送的信息: "+message.getPayload().toString());

    }

    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        log.info("WebSocket服務端異常:連接異常信息: " + exception.getMessage());
        log.info("token : "+getToken(session) + ",deviceId : "+getDeviceId(session) +" => "+ exception.getMessage());
        closeSession(getToken(session));
    }

    private static void closeSession(String token,String deviceId, boolean isError){
        log.info("關閉通信後 處理業務");
    }
	
	
}

權限驗證,根據自己具業務驗證權限

public class HandShakeInterceptor  extends HttpSessionHandshakeInterceptor {

    private final Logger logger = LoggerFactory.getLogger(HandShakeInterceptor.class);
    /*
     * 在WebSocket連接建立之前的操作,以鑑權爲例
     */
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,
                                   WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
        ServletServerHttpRequest serverRequest = (ServletServerHttpRequest) request;
        String token = serverRequest.getServletRequest().getParameter("token");
        if (("null".equals(token) || TokenCacheUtils.validateToken(token))) {
           //此處將token傳遞到WebSocketController,必須寫否則拿不到數據
            attributes.put("token", token);
            return super.beforeHandshake(request, response, wsHandler, attributes);
        } else {
            return false;
        }
    }



    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response,
                               WebSocketHandler wsHandler, Exception ex) {
        // 省略根據業務處理
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章