本篇文章为你整理了SpringCloud整合WebSocket实现用户监控()的详细内容,包含有 SpringCloud整合WebSocket实现用户监控,希望能帮助你了解 SpringCloud整合WebSocket实现用户监控。
1. 在父项目ams-cloud下建立maven子项目ams-websocket
2.pom文件添加常用依赖,另外添加redis依赖等,我这里直接引用common模块
dependencies
dependency
groupId com.alibaba.cloud /groupId
artifactId spring-cloud-starter-alibaba-nacos-config /artifactId
/dependency
dependency
groupId com.alibaba.cloud /groupId
artifactId spring-cloud-starter-alibaba-nacos-discovery /artifactId
/dependency
dependency
groupId com.alibaba.cloud /groupId
artifactId spring-cloud-starter-alibaba-sentinel /artifactId
/dependency
dependency
groupId org.springframework.boot /groupId
artifactId spring-boot-starter-web /artifactId
/dependency
dependency
groupId org.springframework.boot /groupId
artifactId spring-boot-starter-websocket /artifactId
/dependency
dependency
groupId com.ams /groupId
artifactId ams-common /artifactId
version ${ams.version} /version
/dependency
/dependencies
3.添加bootstrap.yml文件
server:
port: 21000
spring:
application:
name: ams-websocket
cloud:
nacos:
# 注册中心
discovery:
server-addr: http://192.168.132.129:8848
# 配置中心
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
file-extension: yaml
shared-configs[0]:
data-id: ams-common.yaml
refresh: true
logging:
level:
spring.: DEBUG
4.创建application
@EnableDiscoveryClient
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan("com.ams")
public class WebsocketApp {
public static void main(String[] args) {
SpringApplication.run(WebsocketApp.class,args);
二、添加config类、拦截器类、处理器类等
1.添加config类
@Configuration
@EnableWebSocket
public class WebsocketConfig implements WebSocketConfigurer {
@Autowired
private RedisUtils redisUtils;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
// 注册websocket组件 添加处理器和拦截器
// websocket是websocket服务器的请求路径可以自己定义
registry.addHandler(new WebsocketHandler(redisUtils),"/websocket")
//指定自定义拦截器
.addInterceptors(new WebsocketInterceptor(redisUtils))
//允许跨域
.setAllowedOrigins("*");
//在某些低版本的浏览器中不支持websocket可以用sock-js替代
registry.addHandler(new WebsocketHandler(redisUtils),"/sock-js")
// 指定自定义拦截器
.addInterceptors(new WebsocketInterceptor(redisUtils))
// 允许跨域
.setAllowedOrigins("*")
// 开启sockJs支持
.withSockJS();
2.添加拦截器类
@Slf4j
public class WebsocketInterceptor extends HttpSessionHandshakeInterceptor {
private final RedisUtils redisUtils;
public WebsocketInterceptor(RedisUtils redisUtils){
this.redisUtils=redisUtils;
/** 管理握手过程,存入用户信息 */
@Override
public boolean beforeHandshake(ServerHttpRequest request,
ServerHttpResponse response,
WebSocketHandler handler,
Map String, Object map) throws Exception {
String header_key = "Sec-WebSocket-Protocol";
HttpHeaders headers = request.getHeaders();
String token = headers.getFirst(header_key);
log.info("token = [{}]", token);
HttpHeaders responseHeaders = response.getHeaders();
UserAuthDTO userAuthDTO = getUserInfo(token);
if(userAuthDTO == null){
log.error("socket连接失败 --- token过期 --- [{}]", token);
response.setStatusCode(HttpStatus.NETWORK_AUTHENTICATION_REQUIRED);
return false;
map.put("userAuthDTO",userAuthDTO);
responseHeaders.add(header_key,token);
return super.beforeHandshake(request, response, handler, map);
/** 通过redis读取用户信息 **/
public UserAuthDTO getUserInfo(String token) {
String key = token;
if(StrUtil.isEmpty(key)){
return null;
UserAuthDTO userAuthDTO = (UserAuthDTO) redisUtils.get(key);
if(userAuthDTO==null){
log.error("redis用户信息空 --- 登录过期/token不正确");
return null;
return userAuthDTO;
3.添加处理器类
@Slf4j
public class WebsocketHandler extends AbstractWebSocketHandler {
//定义全局变量用于保存所有用户的会话
/** 系统管理员 **/
public static final Map String, WebSocketSession SYSUSER_SOCKETS = new HashMap ();
private static RedisUtils redisUtils;
public WebsocketHandler(RedisUtils redisUtils){
WebsocketHandler.redisUtils = redisUtils;
* webSocket连接创建后调用
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
Map String, Object attrMap = session.getAttributes();
UserAuthDTO userAuthDTO = (UserAuthDTO) attrMap.get("userAuthDTO");
SYSUSER_SOCKETS.put(userAuthDTO.getUserId().toString(),session);
log.info("管理员[{}]连接成功,当前在线人数[{}]", userAuthDTO.getUsername(), SYSUSER_SOCKETS.size());
* 接收到消息会调用
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
try {
log.info("收到客户端消息[{}]", message);
if(session.isOpen()){
session.sendMessage(message);
} catch (Exception e) {
e.printStackTrace();
* 连接关闭会调用
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
log.info("客户端关闭连接....");
Map String, Object attrMap = session.getAttributes();
// 删除缓存
deleteSocket(attrMap);
// 关闭连接
session.close();
log.info("已关闭socket连接");
* 删除socket缓存
public static void deleteSocket(Map String, Object attr) {
UserAuthDTO userAuthDTO = (UserAuthDTO) attr.get("userAuthDTO");
if (!SYSUSER_SOCKETS.isEmpty()) {
SYSUSER_SOCKETS.remove(userAuthDTO.getUserId().toString());
log.info("管理员[{}]关闭连接了,当前在线人数[{}]", userAuthDTO.getUsername(), SYSUSER_SOCKETS.size());
* 连接出错会调用
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
log.error("socket连接出错...");
exception.printStackTrace();
Map String, Object attrMap = session.getAttributes();
//删除缓存
deleteSocket(attrMap);
// 关闭连接
session.close();
log.error("已关闭socket连接");
三、添加controller
1.controller如下:
@RestController
@RequestMapping("/websocket")
@Slf4j
@RequiredArgsConstructor
public class WebsocketController {
/** 获取在线管理用户 */
@GetMapping(value = "getLoginSysUser")
public R List UserAuthDTO getLoginSysUser(){
Map String, WebSocketSession userMap = WebsocketHandler.SYSUSER_SOCKETS;
List UserAuthDTO list = new ArrayList ();
userMap.forEach((k,v)- {
Map String, Object attrMap = v.getAttributes();
UserAuthDTO userAuthDTO = (UserAuthDTO) attrMap.get("userAuthDTO");
list.add(userAuthDTO);
return R.ok(list);
2.运行结果
2022-03-04 16:58:56.822 INFO 15272 --- [nio-21000-exec-2] c.c.f.m.w.config.WebsocketInterceptor : token = [83868c09-a744-4a7a-a16e-24dc3d7e8cdc]
2022-03-04 16:58:59.335 INFO 15272 --- [nio-21000-exec-2] c.c.f.m.w.handler.WebsocketHandler : 管理员[admin]连接成功,当前在线人数[1]
*随心所往,看见未来。Follow your heart,see night!*
**欢迎点赞、关注、留言,一起学习、交流!**
以上就是SpringCloud整合WebSocket实现用户监控()的详细内容,想要了解更多 SpringCloud整合WebSocket实现用户监控的内容,请持续关注盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。