专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

我与spring webSocket不得不说的事

ins518 2025-05-16 13:54:52 技术文章 30 ℃ 0 评论

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,就在那个页面添加下边代码)

动动发财的小手给个赞和关注,爱你们哟

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表