174. Spring Boot WebSocket:群聊-昵称

需求缘起:

在上一篇文章已经可以群聊功能了,但是存在一个问题,就是无法显示消息是谁发送了,这样就会导致消息乱七八糟的无法解读。在这版文章中解决昵称显示的问题。

效果展示:

悟空消息:

师傅消息:

八戒消息:

(1)在连接的时候,让用户输入昵称

这个简单,只需要提供一个input让用户进行输入即可:

昵称:<input type="text" id="nickname"/>

<button οnclick="conectWebSocket()">连接WebSocket</button>

(2)连接前的校验

在用户点击连接判断用户是否输入昵称了:

var nickname = document.getElementById("nickname").value;

if(nickname==""){

alert("请输入昵称");

return;

}

以上这些都是简单了,那问题的关键就是如何把昵称显示在聊天信息中呢?这里提供几种思路,大家可以自己开拓方法。

(3)昵称显示方式1:消息携带

这种方式就是在发送消息的时候,直接拼接上用户的昵称,这种改动是最小的,也是比较简单的方式,只需要修改前端网页代码即可:

//获取输入的文本信息进行发送

var message = document.getElementById('text').value;

websocket.send(nickname+":"+message);

但是这种方式有一个弊端,就是服务端要知道用户的昵称就比较费劲了,所以这种方式就是玩玩而已,实际不这么玩。

(4)昵称显示方式2:连接传递

这个就是在建立连接的时候传递到服务端连接点。

首先修改客户端的连接方式:

websocket = new WebSocket("ws://localhost:8080/websocket/"+nickname);

 服务端的服务端点发布:

@ServerEndpoint(value = "/websocket/{nickname}")

@Component

public class MyWebSocket {}

服务端获取参数:

这个在每个方法中都可以获取的,使用@PathParam("nickname") String nickname,比如在连接的时候:

@OnOpen

public void onOpen(Session session,@PathParam("nickname") String nickname) {

this.session = session;

this.nickname = nickname;

}

(5)昵称显示方式3:使用httpSession

这种方式实现起来就比较复杂了,这里只说下大概的一个思路,就是将昵称保存到httpSession对象中,使用httpSession.setAttribute("nickname",nickname)进行存储。

问题的关键是如何在websocket中获取到httpSession呢,主要是通过添加一个配置类进行实现:

//配置类 将http中的session传入websocket中

public class GetHttpSessionConfigurator extends

ServerEndpointConfig.Configurator {

@Override

public void modifyHandshake(ServerEndpointConfig config,

HandshakeRequest request, HandshakeResponse response) {

HttpSession httpSession = (HttpSession) request.getHttpSession();

config.getUserProperties().put(HttpSession.class.getName(), httpSession);

}

}

那么在WebSocket就可以获取到HttpSession对象了:

。。。。。。。。。。。。。。。。。

版权原因,完整文章,请参考如下:174. Spring Boot WebSocket:群聊-昵称

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值