SpringBoot的WebSocket实现单聊群聊

网友投稿 851 2023-02-09

SpringBoot的WebSocket实现单聊群聊

SpringBoot的WebSocket实现单聊群聊

本文实例为大家分享了SpringBoot的WebSocket实现单聊群聊,供大家参考,具体内容如下

说在开头

在HTTP协议中,所有的请求都是由客户端发送给服http://务端,然后服务端发送请求

要实现服务器向客户端推送消息有几种methods:

1、轮询

大量无效请求,浪费资源

2、长轮询

有新数据再推送,但这会导致连接超时,有一定隐患

3、Applet和Flash

过时,安全隐患,兼容性不好

消息群发

创建新项目:

添加依赖:

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-websocket

org.webjars

sockjs-client

1.1.2

org.webjars

jquery

3.3.1

org.webjars

stomp-websocket

2.3.3

org.webjars

webjars-locator-core

创建WebSocket配置类:WebSocketConfig

@Configuration

@EnableWebSocketMessageBroker//注解开启webSocket消息代理

public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

/**

* 配置webSocket代理类

* @param registry

*/

@Override

public void configureMessageBroker(MessageBrokerRegistry registry) {

registry.enableSimpleBroker("/topic"); //代理消息的前缀

registry.setApplicationDestinationPrefixes("/app"); //处理消息的方法前缀

}

@Override

public void registerStompEndpoints(StompEndpointRegistry registry) {

registry.addEndpoint("/chat").withSockJS(); //定义一个/chat前缀的endpioint,用来连接

}

}

创建Bean

/**

* 群消息类

*/

public class Message {

private String name;

private String content;

//省略getter& setter

}

定义controller的方法:

/**

* MessageMapping接受前端发来的信息

* SendTo 发送给信息WebSocket消息代理,进行广播

* @param message 页面发来的json数据封装成自定义Bean

* @return 返回的数据交给WebSocket进行广播

* @throws Exception

*/

@MessageMapping("/hello")

@SendTo("/topic/greetings")

public Message greeting(Message message) throws Exception {

return message;

}

私聊

既然是私聊,就要有对象目标,也是用户,可以用SpringSecurity引入

所以添加额外依赖:

org.springframework.boot

spring-boot-starter-security

配置SpringSecurity

@Configuration

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Bean

PasswordEncoder passwordEncoder(){

return new BCryptPasswordEncoder();

}

@Override

protected void configure(AuthenticationManagerBuilder auth) throws Exception {

auth.inMemoryAuthentication()

.withUser("panlijie").roles("admin").password("$2a$10$5Pf0KhCdnrpMxP5aRrHvMOsvV2fvfWJqk0SEDa9vQ8OWwV8emLFhi")

.and()

.withUser("suyanxia").roles("user").password("$2a$10$5Pf0KhCdnrpMxP5aRrHvMOsvV2fvfWJqk0SEDa9vQ8OWwV8emLFhi");

}

@Override

protected void configure(HttpSecurity http) throws Exception {

http.authorizeRequests()

.anyRequest().authenticated()

.and()

.formLogin()

.permitAll();

}

}

在原来的WebSocketConfig配置类中修改:也就是多了一个代理消息前缀:"/queue"

@Configuration

@EnableWebSocketMessageBroker//注解开启webSocket消息代理

public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

/**

* 配置webSocket代理类

* @param registry

*/

@Override

public void configureMessageBroker(MessageBrokerRegistry registry) {

registry.enableSimpleBroker("/topic","/queue"); //代理消息的前缀

registry.setApplicationDestinationPrefixes("/app"); //处理消息的方法前缀

}

@Override

public void registerStompEndpoints(StompEndpointRegistry registry) {

registry.addEndpoint("/chat").withSockJS(); //定义一个/chat前缀的endpioint,用来连接

}

}

创建Bean:

public class Chat {

private String to;

private String from;

private String content;

//省略getter& setter

}

添加controller方法:

/**

* 点对点发送信息

* @param principal 当前用户的信息

* @param chat 发送的信息

*/

@MessageMapping("chat")

public void chat(Principal principal, Chat chat) {

//获取当前对象设置为信息源

String from = principal.getName();

chat.setFrom(from);

//调用convertAndSendToUser("用户名","路径","内容");

simpMessagingTemplate.convertAndSendToUser(chat.getTo(), "/queue/chat", chat);

}

创建页面:

输入聊天内容

暂结!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:网络安全是属于前端吗(网络安全是属于前端吗对吗)
下一篇:@PathVariable为空时指定默认值的操作
相关文章

 发表评论

暂时没有评论,来抢沙发吧~