<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
@Data public class User extends BaseBean implements Principal, Serializable { private String name; private String username; private String password; public User(String name) { this.name = name; } public User() { } }
/** * @author green * @date 2018/5/15/015 消息接受的类*/ public class WiselyMessage { private String name; public String getName(){ return name; } }
/** * @author green * @date 2018/5/15/015 * 消息推送的类 */ public class WiselyResponse { private String responseMessage; public WiselyResponse(String responseMessage){ this.responseMessage = responseMessage; } public String getResponseMessage(){ return responseMessage; } }
public class UserInterceptor extends ChannelInterceptorAdapter { /** * 获取包含在stomp中的用户信息 */ @SuppressWarnings("rawtypes") @Override public Message<?> preSend(Message<?> message, MessageChannel channel) { StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class); if (StompCommand.CONNECT.equals(accessor.getCommand())) { Object raw = message.getHeaders().get(SimpMessageHeaderAccessor.NATIVE_HEADERS); if (raw instanceof Map) { Object name = ((Map) raw).get("name"); if (name instanceof LinkedList) { // 设置当前访问器的认证用户 accessor.setUser(new User(((LinkedList) name).get(0).toString())); } } } return message; } }
@Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/endpointWisely").withSockJS();//群发 } @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/queue","/topic");//topic:广播式的推送 } /** * 配置客户端入站通道拦截器 */ @Override public void configureClientInboundChannel(ChannelRegistration registration) { registration.setInterceptors(createUserInterceptor()); } /** * * @Title: createUserInterceptor * @Description: 将客户端渠道拦截器加入spring ioc容器 * @return */ @Bean public UserInterceptor createUserInterceptor() { return new UserInterceptor(); } }
@Controller @RequestMapping("/wsc") public class WsController { @Autowired private SimpMessagingTemplate messagingTemplate;//1 @MessageMapping("/welcome") @SendTo("/topic/getResponse") public WiselyResponse say(WiselyMessage message) throws Exception { return new WiselyResponse("hello this is test, " + message.getName() + "!"); } @Autowired private SimpUserRegistry userRegistry; @RequestMapping(value = "/templateTest") //直接访问该接口 @ResponseBody public RtMsg templateTest(HttpSession session) { //发送消息给指定用户,指定发送给用户名为gl的账户 messagingTemplate.convertAndSendToUser("gl", "/queue/message", new WiselyResponse("服务器主动推的数据")); return new RtMsg(); //这里随便写,只是为了模板引擎不报错而已 } //群发页面 @RequestMapping("/push") public String push(){ return "websocket"; } }
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>广播式推送</title> </head> <body> <noscript><h2 style="color: #ff0000">貌似你的浏览器不支持websocket</h2></noscript> <div> <div id="conversationDiv"> <label>输入你的名字</label><input type="text" id="name" /> <button id="sendName" οnclick="sendName();">发送</button> </div> </div> <script src="../websocket/sockjs.min.js" type="text/javascript"></script> <script src="../websocket/stomp.min.js" type="text/javascript"></script> <script src="../js/jquery-3.2.0.min.js"></script> <script type="text/javascript"> <!--群发--> var stompClient = null; var socket = new SockJS('/endpointWisely'); //1 stompClient = Stomp.over(socket);//2 function sendName() { var name = $('#name').val(); stompClient.send("/welcome", {}, JSON.stringify({ 'name': name }));//5 } </script> </body> </html>
<!-- index 首页 --> <script th:inline="javascript"> // var session=[[session.USER_IN_SESSION]]; var user=[[${session.USER_IN_SESSION.username}]];//指定发送时,保存在session中的用户 var socket = new SockJS('/endpointWisely'); //1 stompClient = Stomp.over(socket);//2 stompClient.connect({ name: user }, function(frame) {//3 stompClient.subscribe('/topic/getResponse', function(respnose){ //群发的订阅 showResponse(JSON.parse(respnose.body).responseMessage); }); stompClient.subscribe('/user/queue/message', function (response) { //指定发送的订阅 var returnData = JSON.parse(response.body); showResponse("你接收到的消息为:" + returnData.responseMessage); }); }); function disconnect() { if (stompClient != null) { stompClient.disconnect(); } } function showResponse(message) { alert(message) } </script>
借鉴的博客: https://www.cnblogs.com/Java-dzz/p/6179317.html
https://blog.csdn.net/qq_28988969/article/details/78134114?locationNum=9&fps=1