基於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) {
// 省略根據業務處理
}
}