springboot集成websocket点对点推送广播推送Word文档下载推荐.docx
- 文档编号:6195239
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:11
- 大小:17.41KB
springboot集成websocket点对点推送广播推送Word文档下载推荐.docx
《springboot集成websocket点对点推送广播推送Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《springboot集成websocket点对点推送广播推送Word文档下载推荐.docx(11页珍藏版)》请在冰点文库上搜索。
16
17
18
19
20
import
lombok.AllArgsConstructor;
lombok.Builder;
lombok.Data;
lombok.NoArgsConstructor;
java.io.Serializable;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public
class
NotifyBean<
T>
implements
Serializable{
private
static
final
long
serialVersionUID=1L;
int
type;
Stringmessage;
Tdata;
}
三、因为要实现点对点的推送,所以需要创建一个监听器来获取到websocket的session,如下:
21
22
23
24
org.springframework.beans.factory.annotation.Autowired;
org.springframework.context.ApplicationListener;
org.springframework.messaging.simp.stomp.StompHeaderAccessor;
org.springframework.web.socket.messaging.SessionConnectEvent;
STOMPConnectEventListener
ApplicationListener<
SessionConnectEvent>
{
@Autowired
RedisHelperredisHelper;
@Override
void
onApplicationEvent(SessionConnectEventevent){
StompHeaderAccessorsha=StompHeaderAccessor.wrap(event.getMessage());
//logingetfrombrowser
if(sha.getNativeHeader("
userid"
)==null){
return;
Stringuserid=sha.getNativeHeader("
).get(0);
StringsessionId=sha.getSessionId();
redisHelper.redisTemplate.opsForValue().set("
websocket:
"
+userid,sessionId);
四、最重要的配置类
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
lombok.extern.slf4j.Slf4j;
org.springframework.context.annotation.Bean;
org.springframework.context.annotation.Configuration;
org.springframework.messaging.Message;
org.springframework.messaging.MessageChannel;
org.springframework.messaging.simp.config.ChannelRegistration;
org.springframework.messaging.simp.config.MessageBrokerRegistry;
org.springframework.messaging.simp.stomp.StompCommand;
org.springframework.messaging.support.ChannelInterceptorAdapter;
org.springframework.messaging.support.MessageHeaderAccessor;
org.springframework.web.socket.config.annotation.*;
@Configuration
@EnableWebSocketMessageBroker
@Slf4j
WebSocketConfig
extends
AbstractWebSocketMessageBrokerConfigurer{
//STOMP监听类
@Bean
STOMPConnectEventListenerapplicationStartListener(){
return
new
STOMPConnectEventListener();
registerStompEndpoints(StompEndpointRegistrystompEndpointRegistry){
//建立连接端点,注册一个STOMP的协议节点,并指定使用SockJS协议
stompEndpointRegistry.addEndpoint("
/nmpSocketWeb"
)
.setAllowedOrigins("
*"
.withSockJS();
configureMessageBroker(MessageBrokerRegistrymessageBrokerRegistry){
//配置消息代理(MessageBroker)。
messageBrokerRegistry.enableSimpleBroker("
/topic"
);
//推送消息前缀
messageBrokerRegistry.setApplicationDestinationPrefixes("
/app"
//应用请求前缀,前端发过来的消息将会带有“/app”前缀。
configureClientInboundChannel(ChannelRegistrationregistration){
//token认证
registration.setInterceptors(new
ChannelInterceptorAdapter(){
Message<
?
>
preSend(Message<
message,MessageChannelchannel){
StompHeaderAccessoraccessor=MessageHeaderAccessor.getAccessor(message,StompHeaderAccessor.class);
if
(StompCommand.CONNECT.equals(accessor.getCommand())||StompCommand.SEND.equals(accessor.getCommand())){
Stringtoken=accessor.getFirstNativeHeader("
token"
try
{
tokenValidate(token);
}
catch
(Exceptione){
log.error(e.toString());
null;
message;
});
boolean
tokenValidate(Stringtoken)
throws
Exception{
(token==
null
||token.isEmpty()){
throw
Exception("
webSocket:
token为空!
(JwtUtil.validateToken(token)==null){
webSoc:
token无效!
true;
代码中有详细的解释,认真看可以看明白的。
五、controller
io.swagger.annotations.Api;
io.swagger.annotations.ApiOperation;
org.springframework.messaging.MessageHeaders;
org.springframework.messaging.handler.annotation.MessageMapping;
org.springframework.messaging.handler.annotation.SendTo;
org.springframework.messaging.simp.SimpMessageHeaderAccessor;
org.springframework.messaging.simp.SimpMessageType;
org.springframework.messaging.simp.SimpMessagingTemplate;
org.springframework.stereotype.Controller;
org.springframework.web.bind.annotation.RequestMapping;
org.springframework.web.bind.annotation.ResponseBody;
@Api(tags="
WebSocket控制器"
description="
@Controller
@RequestMapping(value=
/webSocket"
WebSocketController
BaseController{
SimpMessagingTemplatesimpMessagingTemplate;
@ApiOperation(value=
测试主动发送消息"
notes=
httpMethod=
GET"
/sendMsg"
@ResponseBody
sendMsg(){
System.out.println("
NotifyBeannotifyBean=NotifyBean.builder().message("
服务器给你发消息啦!
).build();
simpMessagingTemplate.convertAndSend(WebConstant.WEB_SC_TOPIC_NOTIFY,notifyBean);
@MessageMapping("
/test"
)
//当浏览器向服务端发送请求时,通过@MessageMapping映射/welcome这个地址,类似于@ResponseMapping
@SendTo(WebConstant.WEB_SC_TOPIC_NOTIFY)//当服务器有消息时,会对订阅了@SendTo中的路径的浏览器发送消息
NotifyBeantest(UserVouserVo){
//睡眠1秒
Thread.sleep(1000);
(InterruptedExceptione){
e.printStackTrace();
welcome!
+userVo.getName()).build();
notifyBean;
/**
*点对点发送消息demo
*根据用户key发送消息
*@paramuserVo
*@return
*@throwsException
*/
/test/toOne"
toOne(UserVouserVo)
StringsessionId=(String)redisHelper.redisTemplate.opsForValue().get("
+userVo.getId());
//convertAndSendToUser该方法会在订阅路径前拼接"
/user"
,所以前端订阅的路径全路径是"
/user/topic/notify"
simpMessagingTemplate.convertAndSendToUser(sessionId,WebConstant.WEB_SC_TOPIC_NOTIFY,notifyBean,createHeaders(sessionId));
MessageHeaderscreateHeaders(StringsessionId){
SimpMessageHeaderAccessorheaderAccessor=SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
headerAccessor.setSessionId(sessionId);
headerAccessor.setLeaveMutable(true);
headerAccessor.getMessageHeaders();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- springboot 集成 websocket 点对点 推送 广播