首页 > 其他分享 >174. Spring Boot WebSocket:群聊-昵称

174. Spring Boot WebSocket:群聊-昵称

时间:2023-06-26 17:34:54浏览次数:39  
标签:WebSocket Spring Boot 昵称 session websocket HttpSession nickname httpSession

 

需求缘起:

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

效果展示:

 

悟空消息:

174. Spring Boot WebSocket:群聊-昵称_spring boot视频


 

 

 

师傅消息:

174. Spring Boot WebSocket:群聊-昵称_spring boot实战_02


 

 

 

八戒消息:

174. Spring Boot WebSocket:群聊-昵称_从零开始学Spring Boot_03


 

(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对象了:



@OnOpen 
public void onOpen(Session session, EndpointConfig config) { 
        this.session = session; 
        httpSession = (HttpSession) config.getUserProperties().get( 
                HttpSession.class.getName()); 
}



这种方式具体可以参考链接的文章,博主并没有具体的进行实现,只是简单看了下文章内容,具体地址如下:

方案总结

       本篇文章最终使用的是方式2的方式进行实现,对于方式2和方式3都有各自的使用场景,大家可以自己进行斟酌。




标签:WebSocket,Spring,Boot,昵称,session,websocket,HttpSession,nickname,httpSession
From: https://blog.51cto.com/u_11142439/6556185

相关文章

  • springboot 跨域设置
      写文章 SpringBoot项目解决跨域的几种方案小满只想睡觉一直快乐!​关注她  在用SpringBoot开发后端服务时,我们一般是提供接口给前端使用,但前端通过浏览器调我们接口时,浏览器会有个同源策略的限制,即协议,域名,端口任一不一样时都会......
  • 深度解析SpringBoot内嵌Web容器
    你好,我是刘牌!前言今天分享一个SpringBoot的内嵌Web容器,在SpringBoot还没有出现时,我们使用Java开发了Web项目,需要将其部署到Tomcat下面,需要配置很多xml文件,SpringBoot出现后,就从繁琐的xml文件中解脱出来了,SpringBoot将Web容器进行了内嵌,我们只需要将项目打成一个jar包,就可以运行......
  • Spring生命周期
    SpringBean的生命周期Spring框架中的组件被称为Bean,每个Bean都有其特定的生命周期。下面是SpringBean的生命周期的主要阶段:实例化:在这个阶段,Spring容器根据Bean定义创建Bean的实例。这可以通过构造函数或工厂方法来实现。属性注入:在实例化完成后,Spring容器将会为Bean的属......
  • Spring IoC有什么好处呢?
      来源   https://www.zhihu.com/question/23277575?utm_id=0   SpringIoC有什么好处呢? 作者:Mingqi链接:https://www.zhihu.com/question/23277575/answer/169698662来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。要了解控......
  • SpringCloud http大文件断点续传上传
    ​ 第一点:Java代码实现文件上传FormFilefile=manform.getFile();StringnewfileName= null;Stringnewpathname= null;StringfileAddre= "/numUp";try{    InputStreamstream=file.getInputStream();// 把文件读入    StringfilePath=request.......
  • spring系列框架有哪些
    springboot包含了springMVC,但后者需要手动配置很多东西才能跑起来,包括繁琐的xml配置,而springboot会自动配置,比如用注解简化了配置(不用配xml),没有手动也会有默认值 SpringBoot就是一个工具,他集成了SpringMVC。Web开发用的实际还是SpringMVC那一套SpringS......
  • SpringMVC http大文件断点续传上传
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......
  • 肝了一周总结的SpringBoot常用注解大全,看完就炉火纯青了!
      来源于 https://www.macrozheng.com/mall/reference/springboot_annotation.html  肝了一周总结的SpringBoot常用注解大全,看完就炉火纯青了!   平时使用SpringBoot开发项目,少不了要使用到它的注解。这些注解让我们摆脱了繁琐的传统SpringXML配置,让我们开发项目......
  • Spring Boot - 异步任务
    SpringBoot-异步任务前言有时候,前端可能提交了一个耗时任务,如果后端接收到请求后,直接执行该耗时任务,那么前端需要等待很久一段时间才能接受到响应。如果该耗时任务是通过浏览器直接进行请求,那么浏览器页面会一直处于转圈等待状态。一个简单的例子如下所示:@RestController@R......
  • spring boot 编译打包时将自定义引入的.jar包依赖,全部打包进去
    发现自己引入的.jar包,在打包时,.jar包并不会打进去,导致报错。打包时打入自定义.jar包方法:<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</a......