配置:(需要实现WebSocketConfigurer接口)
@Configuration @EnableWebSocket public class WsConfigure implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new MyHandler(),"/echo").addInterceptors(new MyInterceptor()).setAllowedOrigins("*"); } }
或者使用配置Spring配置文件
<bean id="websocket" class="com.abc.websocket.handler.WebsocketEndPoint"/>
<websocket:handlers allowed-origins="*">
<websocket:mapping path="/websocket" handler="websocket"/>
<websocket:handshake-interceptors>
<bean class="com.abc.websocket.HandshakeInterceptor"/>
</websocket:handshake-interceptors>
</websocket:handlers>
配置主要配置
访问路径、Interceptor、Handler
第二个文件 Interceptor
public class MyInterceptor extends HttpSessionHandshakeInterceptor { @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; //在request中拿到Session HttpSession httpsession = servletRequest.getServletRequest().getSession(true); //把Session中的SessionId存到WebSocketSession中 attributes.put("UHSN",httpsession.getId()); 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); } }
第三个文件 Handler
public class MyHandler extends TextWebSocketHandler { //用来保存所有用户的WebSocketSession对象 private static final ArrayList<WebSocketSession> users = new ArrayList<>(); @Override //接收到消息的处理 protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { super.handleTextMessage(session, message); //TextMessage returnMessage = new TextMessage(message.getPayload()+" 学你说话"); users.forEach((user) -> { try { if(user.isOpen()) { user.sendMessage(message); } } catch (IOException e1) { e1.printStackTrace(); } }); //session.sendMessage(returnMessage); } @Override //连接后处理 public void afterConnectionEstablished(WebSocketSession session) throws Exception { //连接后WebSocketSession存到users中 users.add(session); String usid = (String)session.getAttributes().get("UHSN"); System.out.println("=========="+usid+"开启了WebSocket连接"); super.afterConnectionEstablished(session); } @Override //关闭连接后处理 public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { //关闭后在users中移除 users.remove(session); String usid = (String)session.getAttributes().get("UHSN"); System.out.println("=========="+usid+"关闭了WebSocket连接"); super.afterConnectionClosed(session, status); } }