Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
B
basic-api-boot
概览
概览
详情
活动
周期分析
版本库
存储库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
Basic
basic-api-boot
Commits
7481fe3d
提交
7481fe3d
authored
4月 18, 2024
作者:
方治民
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
chore: 优化 WebSocket 相关配置和校验
上级
c33f9d96
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
30 行增加
和
19 行删除
+30
-19
WebSocketStompConfig.java
...ava/com/yiring/websocket/config/WebSocketStompConfig.java
+13
-9
AbstractMessageHandler.java
.../yiring/websocket/interceptor/AbstractMessageHandler.java
+3
-3
ClientInboundChannelInterceptor.java
...ebsocket/interceptor/ClientInboundChannelInterceptor.java
+12
-6
ClientOutboundChannelInterceptor.java
...bsocket/interceptor/ClientOutboundChannelInterceptor.java
+2
-1
没有找到文件。
basic-websocket/src/main/java/com/yiring/websocket/config/WebSocketStompConfig.java
浏览文件 @
7481fe3d
...
@@ -39,24 +39,26 @@ public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {
...
@@ -39,24 +39,26 @@ public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {
final
ClientOutboundChannelInterceptor
clientOutboundChannelInterceptor
;
final
ClientOutboundChannelInterceptor
clientOutboundChannelInterceptor
;
public
static
Integer
stompPort
;
public
static
Integer
stompPort
;
public
static
boolean
s
imple
Mode
;
public
static
boolean
s
tomp
Mode
;
public
static
String
mode
;
public
static
String
mode
;
@PostConstruct
@PostConstruct
public
void
init
()
{
public
void
init
()
{
stompPort
=
Convert
.
toInt
(
SpringUtil
.
getProperty
(
"spring.rabbitmq.stomp-port"
));
stompPort
=
Convert
.
toInt
(
SpringUtil
.
getProperty
(
"spring.rabbitmq.stomp-port"
));
s
impleMode
=
Objects
.
is
Null
(
stompPort
);
s
tompMode
=
Objects
.
non
Null
(
stompPort
);
mode
=
s
impleMode
?
"Simple"
:
"STOMP
"
;
mode
=
s
tompMode
?
"STOMP"
:
"Simple
"
;
}
}
@Override
@Override
public
void
registerStompEndpoints
(
StompEndpointRegistry
registry
)
{
public
void
registerStompEndpoints
(
StompEndpointRegistry
registry
)
{
// SockJS 连接
registry
registry
.
addEndpoint
(
"/stomp/sock-js"
)
.
addEndpoint
(
"/stomp/sock-js"
)
.
setAllowedOriginPatterns
(
"*"
)
.
setAllowedOriginPatterns
(
"*"
)
.
addInterceptors
(
new
HttpSessionHandshakeInterceptor
())
.
addInterceptors
(
new
HttpSessionHandshakeInterceptor
())
.
withSockJS
();
.
withSockJS
();
// 原生 WebSocket 连接
registry
registry
.
addEndpoint
(
"/stomp/ws"
)
.
addEndpoint
(
"/stomp/ws"
)
.
setAllowedOriginPatterns
(
"*"
)
.
setAllowedOriginPatterns
(
"*"
)
...
@@ -68,6 +70,7 @@ public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {
...
@@ -68,6 +70,7 @@ public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {
@Override
@Override
public
void
configureMessageBroker
(
MessageBrokerRegistry
registry
)
{
public
void
configureMessageBroker
(
MessageBrokerRegistry
registry
)
{
// 启动前先删除掉可能存在的残留STOMP连接缓存数据
// 启动前先删除掉可能存在的残留STOMP连接缓存数据
// FIXME: 没有考虑多服务部署场景,仅单机模式
redis
.
del
(
RedisKey
.
STOMP_ONLINE_USERS
);
redis
.
del
(
RedisKey
.
STOMP_ONLINE_USERS
);
log
.
info
(
"WebSocket(Mode: {}) clear online user info cache of redis."
,
mode
);
log
.
info
(
"WebSocket(Mode: {}) clear online user info cache of redis."
,
mode
);
...
@@ -75,14 +78,12 @@ public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {
...
@@ -75,14 +78,12 @@ public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {
registry
.
setUserDestinationPrefix
(
"/user"
);
registry
.
setUserDestinationPrefix
(
"/user"
);
registry
.
setApplicationDestinationPrefixes
(
"/app"
);
registry
.
setApplicationDestinationPrefixes
(
"/app"
);
if
(
simpleMode
)
{
String
[]
destinationPrefixes
=
{
"/topic"
,
"/queue"
};
// 1. 使用内存方式处理消息
if
(
stompMode
)
{
registry
.
enableSimpleBroker
(
"/topic"
,
"/queue"
);
// 1. 使用 RabbitMQ 处理消息(需要安装 STOMP 插件)
}
else
{
// 2. 使用 RabbitMQ 处理消息(需要安装 STOMP 插件)
RabbitProperties
rabbitProperties
=
SpringUtil
.
getBean
(
RabbitProperties
.
class
);
RabbitProperties
rabbitProperties
=
SpringUtil
.
getBean
(
RabbitProperties
.
class
);
registry
registry
.
enableStompBrokerRelay
(
"/topic"
,
"/queue"
)
.
enableStompBrokerRelay
(
destinationPrefixes
)
.
setRelayPort
(
stompPort
)
.
setRelayPort
(
stompPort
)
.
setRelayHost
(
rabbitProperties
.
getHost
())
.
setRelayHost
(
rabbitProperties
.
getHost
())
.
setVirtualHost
(
rabbitProperties
.
getVirtualHost
())
.
setVirtualHost
(
rabbitProperties
.
getVirtualHost
())
...
@@ -90,6 +91,9 @@ public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {
...
@@ -90,6 +91,9 @@ public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {
.
setClientPasscode
(
rabbitProperties
.
getPassword
())
.
setClientPasscode
(
rabbitProperties
.
getPassword
())
.
setSystemLogin
(
rabbitProperties
.
getUsername
())
.
setSystemLogin
(
rabbitProperties
.
getUsername
())
.
setSystemPasscode
(
rabbitProperties
.
getPassword
());
.
setSystemPasscode
(
rabbitProperties
.
getPassword
());
}
else
{
// 2. 使用内存方式处理消息
registry
.
enableSimpleBroker
(
destinationPrefixes
);
}
}
log
.
info
(
"WebSocket(Mode: {}) init messageBroker success."
,
mode
);
log
.
info
(
"WebSocket(Mode: {}) init messageBroker success."
,
mode
);
...
...
basic-websocket/src/main/java/com/yiring/websocket/interceptor/AbstractMessageHandler.java
浏览文件 @
7481fe3d
...
@@ -18,9 +18,9 @@ import org.springframework.stereotype.Component;
...
@@ -18,9 +18,9 @@ import org.springframework.stereotype.Component;
public
class
AbstractMessageHandler
{
public
class
AbstractMessageHandler
{
public
SimpMessageHeaderAccessor
getAccessor
(
@NonNull
Message
<?>
message
)
{
public
SimpMessageHeaderAccessor
getAccessor
(
@NonNull
Message
<?>
message
)
{
Class
<?
extends
SimpMessageHeaderAccessor
>
clazz
=
WebSocketStompConfig
.
s
imple
Mode
Class
<?
extends
SimpMessageHeaderAccessor
>
clazz
=
WebSocketStompConfig
.
s
tomp
Mode
?
S
impMessage
HeaderAccessor
.
class
?
S
tomp
HeaderAccessor
.
class
:
S
tomp
HeaderAccessor
.
class
;
:
S
impMessage
HeaderAccessor
.
class
;
return
MessageHeaderAccessor
.
getAccessor
(
message
,
clazz
);
return
MessageHeaderAccessor
.
getAccessor
(
message
,
clazz
);
}
}
...
...
basic-websocket/src/main/java/com/yiring/websocket/interceptor/ClientInboundChannelInterceptor.java
浏览文件 @
7481fe3d
...
@@ -19,6 +19,7 @@ import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
...
@@ -19,6 +19,7 @@ import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
import
org.springframework.messaging.support.ChannelInterceptor
;
import
org.springframework.messaging.support.ChannelInterceptor
;
import
org.springframework.messaging.support.NativeMessageHeaderAccessor
;
import
org.springframework.messaging.support.NativeMessageHeaderAccessor
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.Assert
;
/**
/**
* ClientInboundChannelInterceptor
* ClientInboundChannelInterceptor
...
@@ -43,7 +44,7 @@ public class ClientInboundChannelInterceptor implements ChannelInterceptor {
...
@@ -43,7 +44,7 @@ public class ClientInboundChannelInterceptor implements ChannelInterceptor {
@Override
@Override
public
Message
<?>
preSend
(
@NonNull
Message
<?>
message
,
@NonNull
MessageChannel
channel
)
{
public
Message
<?>
preSend
(
@NonNull
Message
<?>
message
,
@NonNull
MessageChannel
channel
)
{
SimpMessageHeaderAccessor
accessor
=
handler
.
getAccessor
(
message
);
SimpMessageHeaderAccessor
accessor
=
handler
.
getAccessor
(
message
);
assert
accessor
!=
null
;
Assert
.
state
(
accessor
!=
null
,
"No accessor"
)
;
if
(
handler
.
isConnect
(
accessor
))
{
if
(
handler
.
isConnect
(
accessor
))
{
Object
raw
=
message
.
getHeaders
().
get
(
NativeMessageHeaderAccessor
.
NATIVE_HEADERS
);
Object
raw
=
message
.
getHeaders
().
get
(
NativeMessageHeaderAccessor
.
NATIVE_HEADERS
);
...
@@ -53,11 +54,16 @@ public class ClientInboundChannelInterceptor implements ChannelInterceptor {
...
@@ -53,11 +54,16 @@ public class ClientInboundChannelInterceptor implements ChannelInterceptor {
Object
tokens
=
((
Map
<?,
?>)
raw
).
get
(
"token"
);
Object
tokens
=
((
Map
<?,
?>)
raw
).
get
(
"token"
);
if
(
tokens
instanceof
Collection
<?>)
{
if
(
tokens
instanceof
Collection
<?>)
{
String
token
=
Convert
.
toList
(
String
.
class
,
tokens
).
get
(
0
);
try
{
User
user
=
auths
.
getUserByToken
(
token
);
String
token
=
Convert
.
toList
(
String
.
class
,
tokens
).
get
(
0
);
principal
.
setToken
(
token
);
User
user
=
auths
.
getUserByToken
(
token
);
principal
.
setUser
(
user
.
getRealName
());
principal
.
setToken
(
token
);
principal
.
setType
(
StompPrincipal
.
Type
.
LOGIN_USER
);
principal
.
setUser
(
user
.
getRealName
());
principal
.
setType
(
StompPrincipal
.
Type
.
LOGIN_USER
);
}
catch
(
Exception
e
)
{
log
.
warn
(
"WebSocket(Mode: {}) connect failed: {}"
,
WebSocketStompConfig
.
mode
,
e
.
getMessage
());
throw
e
;
}
}
else
{
}
else
{
principal
.
setUser
(
"Guest."
+
principal
.
getSession
());
principal
.
setUser
(
"Guest."
+
principal
.
getSession
());
principal
.
setType
(
StompPrincipal
.
Type
.
GUEST_USER
);
principal
.
setType
(
StompPrincipal
.
Type
.
GUEST_USER
);
...
...
basic-websocket/src/main/java/com/yiring/websocket/interceptor/ClientOutboundChannelInterceptor.java
浏览文件 @
7481fe3d
...
@@ -12,6 +12,7 @@ import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
...
@@ -12,6 +12,7 @@ import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
import
org.springframework.messaging.support.ChannelInterceptor
;
import
org.springframework.messaging.support.ChannelInterceptor
;
import
org.springframework.messaging.support.MessageBuilder
;
import
org.springframework.messaging.support.MessageBuilder
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.Assert
;
/**
/**
* ClientOutboundChannelInterceptor
* ClientOutboundChannelInterceptor
...
@@ -32,7 +33,7 @@ public class ClientOutboundChannelInterceptor implements ChannelInterceptor {
...
@@ -32,7 +33,7 @@ public class ClientOutboundChannelInterceptor implements ChannelInterceptor {
@Override
@Override
public
Message
<?>
preSend
(
@NonNull
Message
<?>
message
,
@NonNull
MessageChannel
channel
)
{
public
Message
<?>
preSend
(
@NonNull
Message
<?>
message
,
@NonNull
MessageChannel
channel
)
{
SimpMessageHeaderAccessor
accessor
=
handler
.
getAccessor
(
message
);
SimpMessageHeaderAccessor
accessor
=
handler
.
getAccessor
(
message
);
assert
accessor
!=
null
;
Assert
.
state
(
accessor
!=
null
,
"No accessor"
)
;
if
(
handler
.
isConnected
(
accessor
))
{
if
(
handler
.
isConnected
(
accessor
))
{
StompPrincipal
principal
=
(
StompPrincipal
)
accessor
.
getUser
();
StompPrincipal
principal
=
(
StompPrincipal
)
accessor
.
getUser
();
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论