spring mvc4.X+Websocket 实现实时消息推送--已开源例子 weir 2015-01-26 17:22:55.0 java,websocket 44993 关于原理我就不啰嗦了。自己在网上搜一下就知道了。 应广大网友要求,已开源一个例子更参考:http://git.oschina.net/weir/spring_websocket 1.注册服务: package com.tw.webSocket; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; 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 @EnableWebSocket public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer{ @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(systemWebSocketHandler(), "/webSocketServer").addInterceptors(new MyHandshakeInterceptor()); System.out.println("registed!"); registry.addHandler(systemWebSocketHandler(), "/sockjs/webSocketServer").addInterceptors(new MyHandshakeInterceptor()).withSockJS(); } @Bean public WebSocketHandler systemWebSocketHandler(){ return new SystemWebSocketHandler(); } } 我们注册两种:ws 和http 实现websocket。 2.继承握手拦截器: package com.tw.webSocket; import java.util.Map; import javax.servlet.http.HttpSession; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.stereotype.Component; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; import com.tw.entity.sys.User; @Component public class MyHandshakeInterceptor extends HttpSessionHandshakeInterceptor{ @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler handler, Map map) throws Exception { if (request instanceof ServletServerHttpRequest) { ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; HttpSession session = servletRequest.getServletRequest().getSession(false); if (session!=null) { System.out.println("ok"); User u = (User) session.getAttribute("U"); map.put("username", u.getName()); } } return true; } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) { } } 这里是拿到在线的用户。 3.实现服务端的消息接受和推送: package com.tw.webSocket; import java.io.IOException; import java.util.ArrayList; import org.springframework.stereotype.Component; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.WebSocketMessage; import org.springframework.web.socket.WebSocketSession; @Component public class SystemWebSocketHandler implements WebSocketHandler{ private static final ArrayListusers; static{ users = new ArrayList(); } public SystemWebSocketHandler(){ } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { users.remove(session); } @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { System.out.println("Server:cennected OK!"); users.add(session); } @Override public void handleMessage(WebSocketSession session, WebSocketMessage message) throws Exception { TextMessage tm = new TextMessage(message.getPayload()+""); System.out.println(message.getPayload()); session.sendMessage(tm); } @Override public void handleTransportError(WebSocketSession session, Throwable throwable) throws Exception { if (session.isOpen()) { session.close(); } users.remove(session); } @Override public boolean supportsPartialMessages() { return false; } /** * 给所有在线用户发送消息 * @param message */ public void sendMessageToUsers(TextMessage message) { for (WebSocketSession user : users) { if (user.isOpen()) { try { user.sendMessage(message); } catch (IOException e) { e.printStackTrace(); } } } } public void sendMessageToUser(String username,TextMessage message) { for (WebSocketSession user : users) { if (user.getAttributes().get("username").equals(username)) { try { if (user.isOpen()) { user.sendMessage(message); } } catch (IOException e) { e.printStackTrace(); } break; } } } } 4.配置文件applicationContext.xml: 没有变动。 4.2 tw-servlet.xml: 这里就加了个:xmlns:websocket="http://www.springframework.org/schema/websocket" http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket-4.1.xsd 4.3 web.xml 没有任何特殊的。 5.在需要显示消息的页面这样做: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Java API for WebSocket (JSR-356)请输入:发送 <%@ page language="java" pageEncoding="UTF-8"%> hi交流: 6.在controller里面就可以这样调用了: @Bean public SystemWebSocketHandler systemWebSocketHandler(){ return new SystemWebSocketHandler(); } @RequestMapping("/auditing") @ResponseBody public String auditing(HttpServletRequest request){ //无关代码都省略了 systemWebSocketHandler().sendMessageToUser("admin", new TextMessage("你好")); return ""; } 这些代码就可以放在自己需要的任何地方了。 基本就这样了,你想做web聊天室 或 web的网页消息提示都可以。