java後端websocket Spring整合
阿新 • • 發佈:2018-12-19
一、搭建環境
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>4.1.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-messaging</artifactId> <version>4.1.9.RELEASE</version> </dependency>
SpringMVC配置websocket有兩種方式,一種是基於註解,一種是基於xml。這裡我採用註解方式配置。
二、建立配置類
package com..websocket; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; @Configuration @EnableWebMvc @EnableWebSocket public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(systemWebSocketHandler(), "/webSocketServer").addInterceptors(new HandshakeInterceptor()); } @Bean public WebSocketHandler systemWebSocketHandler() { return new ServerWebSocketHandle(); } }
這裡使用的config配置的形式註冊bean和配置,所以需要在SpringMVC的配置檔案中新增對類的自動掃描:
<mvc:annotation-driven />
<context:component-scan base-package="com.websocket"/>
三、訊息處理類
package com.websocket; import com.component.ComToClientComponent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; public class ServerWebSocketHandle extends TextWebSocketHandler { @Autowired ComToClientComponent comToClientComponent; @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { //super.afterConnectionEstablished(session); comToClientComponent.openHandler(session); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { //System.out.println(message.getPayload()); //super.handleTextMessage(session, message); //session.sendMessage(new TextMessage(message.getPayload().toLowerCase())); comToClientComponent.messageHandler(session, message); } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { super.handleTransportError(session, exception); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { //super.afterConnectionClosed(session, status); comToClientComponent.closeHandler(session); } }
四、攔截器類
package com.websocket;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
import java.util.Map;
public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor{
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
return super.beforeHandshake(request, response, wsHandler, attributes);
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
super.afterHandshake(request, response, wsHandler, ex);
}
}
參考: