网站首页 > 技术文章 正文
Websocket大家都听说过吧,相信大家对他的认识可能更多地的是聊天室,消息等。websocket强大、稳定、功能多,但我开发的项目只使用了它的部分功能,并且使用的框架是spring,通过了解知道了spring已经整合了websocket,那么项目开发省了很多步骤。相关介绍大家可以去百科查找。不过多说了,我们直接进入主题。
需求是这样的:
保证一个账号一旦登录,其它设备就无法在登陆这个账号,我的方法是这样的:登录时,向redis中保存该用户主键token,用户点叉号关闭页面或直接关闭浏览器,再登录提示该账号已登录中,为了达到这一目的,决定使用websocket, 通过它保证浏览器点叉号或者关闭浏览器,在登录时不提示账号已登录。
原理:通过websocket实时监测浏览器打开的应用页面关闭或刷新。
1引入websocket
<!--需要引入其他spring包>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
</dependency>
2编写interceptor拦截器
public class LoginWebsocketInterceptor extends HttpSessionHandshakeInterceptor {
private static final String ALONE_USER_TOKEN = "alone_user_token";
//websocket初次握手之前
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
HttpServletRequest servletRequest
= ((ServletServerHttpRequest) request).getServletRequest();
String token = servletRequest.getParameter("token");
if(StringUtils.isNotBlank(token)){
if(!"null".equals(token)){
//attributes中的值会被放进handler处理器中的webSocketSession中
attributes.put(ALONE_USER_TOKEN,token);
}
}
return super.beforeHandshake(request, response, wsHandler, attributes);
}
//websocket握手之后
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
super.afterHandshake(request, response, wsHandler, ex);
}
}
3编写处理器
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
if(session!=null){
//获取token值
Map<String,Object> attributes = session.getAttributes();
List<Map.Entry<String,Object>> list = Lists.newArrayList();
list.addAll(attributes.entrySet());
//获取指定key的值,也就是前边拦截器中放进attributes中的url上的参数
List<Map.Entry<String, Object>> collect =list.stream().filter(Objects::nonNull).filter(n -> "alone_user_token".equals(n.getKey())).collect(Collectors.toList());
...........
}
}
//连接关闭
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
if(session!=null){
//获取token值
Map<String,Object> attributes = session.getAttributes();
List<Map.Entry<String,Object>> list = Lists.newArrayList();
list.addAll(attributes.entrySet());
List<Map.Entry<String, Object>> collect = list.stream().filter(Objects::nonNull).filter(n -> "alone_user_token".equals(n.getKey())).collect(Collectors.toList());
................
}
}
}
4配置websocket(xml形式)
allowed-origins="*" 解决跨域问题
5前端页面(那个页面需要连接websocket,就在那个页面添加下边代码)
动动发财的小手给个赞和关注,爱你们哟
- 上一篇: 从零搭建体育比分网站完整步骤
- 下一篇: JAVA 编码规范
猜你喜欢
- 2025-05-16 放弃 Websocket 使用 SSE 才发现这些功能两三行代码就搞定了
- 2025-05-16 从零搭建体育比分网站完整步骤
- 2025-05-16 「项目实战」.待办事项之WebSocket Web客户端(一)
- 2025-05-16 springboot 2整合websocket推送消息、数据流、解析pdf图片并压缩
- 2025-05-16 Springboot 整合 Websocket 轻松实现IM及时通讯
- 2025-05-16 现在页面实时聊天都使用Websocket技术实现吗?
- 2025-05-16 Trae验证websocket版本功能
- 2025-05-16 Spring Boot3 竟能如此轻松整合 WebSocket 技术,你还不知道?
- 2025-05-16 Springboot下的WebSocket开发
- 2025-05-16 零基础快入门WebRTC:基本概念、关键技术、与WebSocket的区别等
你 发表评论:
欢迎- 592℃几个Oracle空值处理函数 oracle处理null值的函数
- 585℃Oracle分析函数之Lag和Lead()使用
- 573℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 570℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 566℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 558℃【数据统计分析】详解Oracle分组函数之CUBE
- 543℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 539℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端懒加载 (49)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)