SpringBoot 搭建简单聊天室
SpringBoot 搭建简单聊天室(queue 点对点)
1、引用 SpringBoot 搭建 WebSocket 链接
https://www.cnblogs.com/yi1036943655/p/10089100.html
2、整合Spring Security
- package com.example.demo.config;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
- import org.springframework.security.config.annotation.web.builders.HttpSecurity;
- import org.springframework.security.config.annotation.web.builders.WebSecurity;
- import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
- import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
- @Configuration
- @EnableWebSecurity
- public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
- /**
- * 简单解释一下
- * 页面(login、ws)不设置拦截
- * 登录页面login
- * 登陆成功页面chat
- * @param http
- * @throws Exception
- */
- @Override
- protected void configure(HttpSecurity http) throws Exception {
- http
- .authorizeRequests()
- .antMatchers("/","/login","/ws").permitAll()
- .anyRequest().authenticated()
- .and()
- .formLogin()
- .loginPage("/login")
- .defaultSuccessUrl("/chat")
- .permitAll()
- .and()
- .logout()
- .permitAll();
- }
- /**
- * 添加两个用户
- * 账号:wfy 密码:wfy
- * 账号:wisely 密码:wisely
- * 角色:USER
- * @param auth
- * @throws Exception
- */
- @Override
- protected void configure(AuthenticationManagerBuilder auth) throws Exception {
- auth
- .inMemoryAuthentication()
- .passwordEncoder(new MyPasswordEncoder())
- .withUser("wfy").password("wfy").roles("USER")
- .and()
- .withUser("wisely").password("wisely").roles("USER");
- }
- /**
- * 静态资源路径不设置拦截
- * @param web
- * @throws Exception
- */
- @Override
- public void configure(WebSecurity web) throws Exception {
- web.ignoring().antMatchers("/resources/static/**");
- }
- }
3、配置WebSocket
- package com.example.demo.config;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.messaging.simp.config.MessageBrokerRegistry;
- import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
- import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
- import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
- @Configuration
- @EnableWebSocketMessageBroker
- public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
- /**
- * 配置链接端点
- * @param registry
- */
- @Override
- public void registerStompEndpoints(StompEndpointRegistry registry){
- registry.addEndpoint("/endpointWisely").withSockJS();
- registry.addEndpoint("/endpointChat").withSockJS();
- }
- /**
- * 配置消息代理
- * @param registry
- */
- @Override
- public void configureMessageBroker(MessageBrokerRegistry registry){
- registry.enableSimpleBroker("/topic","/queue");
- }
- }
4、书写控制器
- package com.example.demo.controller;
- import com.example.demo.PoJo.WiselyMessage;
- import com.example.demo.PoJo.WiselyResponse;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.messaging.handler.annotation.MessageMapping;
- import org.springframework.messaging.handler.annotation.SendTo;
- import org.springframework.messaging.simp.SimpMessagingTemplate;
- import org.springframework.stereotype.Controller;
- import java.security.Principal;
- @Controller
- public class WsController {
- /**
- * 服务器 推送数据
- */
- @Autowired
- private SimpMessagingTemplate messagingTemplate;
- /**
- * MessageMapping 类似于 RequestMapping
- * SendTo 订阅地址 类似于 订阅一个URL (我的理解就是 调用了这个方法 在返回的时候会给订阅该url的地址发送数据)
- * @param message
- * @return
- * @throws Exception
- */
- @MessageMapping("/welcome")
- @SendTo("/topic/getResponse")
- public WiselyResponse say(WiselyMessage message) throws Exception {
- Thread.sleep(3000);
- return new WiselyResponse("Welcome," + message.getName() + "!");
- }
- /**
- * 通过convertAndSendToUser 向指定用户发送消息
- * @param principal
- * @param msg
- */
- @MessageMapping("/chat")
- public void handleChat(Principal principal,String msg){
- if("wfy".equals(principal.getName())){
- messagingTemplate.convertAndSendToUser("wisely","queue/notifications",principal.getName() + "-send : "+ msg );
- }else{
- messagingTemplate.convertAndSendToUser("wfy","queue/notifications",principal.getName() + "-send : "+ msg );
- }
- }
- }
5、书写页面(chat)
- <!DOCTYPE html>
- <html xmlns:th="http://www.thymeleaf.org">
- <meta charset="UTF-8" />
- <head>
- <title>Home</title>
- <script th:src="@{sockjs.min.js}"></script>
- <script th:src="@{stomp.min.js}"></script>
- <script th:src="@{jquery.js}"></script>
- </head>
- <body>
- <p>
- 聊天室
- </p>
- <form id="wiselyForm">
- <textarea rows="4" cols="60" name="text"></textarea>
- <input type="submit"/>
- </form>
- <script th:inline="javascript">
- $('#wiselyForm').submit(function(e){
- e.preventDefault();
- var text = $('#wiselyForm').find('textarea[name="text"]').val();
- sendSpittle(text);
- });
- var sock = new SockJS("/endpointChat"); //1
- var stomp = Stomp.over(sock);
- stomp.connect('guest', 'guest', function(frame) {
- stomp.subscribe("/user/queue/notifications", handleNotification);//2
- });
- function handleNotification(message) {
- $('#output').append("<b>Received: " + message.body + "</b><br/>")
- }
- function sendSpittle(text) {
- stomp.send("/chat", {}, text);//3
- }
- $('#stop').click(function() {sock.close()});
- </script>
- <div id="output"></div>
- </body>
- </html>
页面(login)
- <!DOCTYPE html>
- <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
- xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
- <meta charset="UTF-8" />
- <head>
- <title>登陆页面</title>
- </head>
- <body>
- <div th:if="${param.error}">
- 无效的账号和密码
- </div>
- <div th:if="${param.logout}">
- 你已注销
- </div>
- <form th:action="@{/login}" method="post">
- <div><label> 账号 : <input type="text" name="username"/> </label></div>
- <div><label> 密码: <input type="password" name="password"/> </label></div>
- <div><input type="submit" value="登陆"/></div>
- </form>
- </body>
- </html>
6、编写视图解析器
- package com.example.demo.config;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
- import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
- @Configuration
- public class WebMvcConfig extends WebMvcConfigurerAdapter {
- @Override
- public void addViewControllers(ViewControllerRegistry registry){
- registry.addViewController("/ws").setViewName("/ws");
- registry.addViewController("/login").setViewName("/login");
- registry.addViewController("/chat").setViewName("/chat");
- }
- }
7、记录一个坑
1)、如果使用的是 Security5.0 以上会报错 java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
解决办法:
- package com.example.demo.config;
- import org.springframework.security.crypto.password.PasswordEncoder;
- public class MyPasswordEncoder implements PasswordEncoder {
- @Override
- public String encode(CharSequence charSequence) {
- return charSequence.toString();
- }
- @Override
- public boolean matches(CharSequence charSequence, String s) {
- return s.equals(charSequence.toString());
- }
- }
SpringBoot 搭建简单聊天室的更多相关文章
- Jaguar_websocket结合Flutter搭建简单聊天室
1.定义消息 在开始建立webSocket之前,我们需要定义消息,如:发送人,发送时间,发送人id等.. import 'dart:convert'; class ChatMessageData { ...
- 基于springboot的websocket聊天室
WebSocket入门 1.概述 1.1 Http #http简介 HTTP是一个应用层协议,无状态的,端口号为80.主要的版本有1.0/1.1/2.0. #http1.0/1.1/2.0 1.HTT ...
- ASP.NET SingalR + MongoDB 实现简单聊天室(一):搭建基本框架
ASP.NET SingalR不多介绍.让我介绍不如看官网,我这里就是直接上源代码,当然代码还是写的比较简单的,考虑的也少,希望各位技友多多提意见. 先简单介绍聊天室功能: 用户加入聊天室,自动给用户 ...
- Python Socket 简单聊天室2
上篇文章写了一个简单的单线程的一问一答的简单聊天室.这次我们使用SocketServer模块搭建一个多线程异步的聊天室. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。
基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ...
- SilverLight搭建WCF聊天室详细过程[转]
http://www.silverlightchina.net/html/zhuantixilie/getstart/2011/0424/7148.html 默认节点 SilverLight搭建WCF ...
- Asp.Net SignalR - 简单聊天室实现
简单聊天室 使用持久链接类我们就可以做一些即时通讯的应用了,我使用Group做了一个简单的聊天室,先上图技术细节下面再讲 可以加入聊天室.创建聊天室.发送消息,下面就说说我是如何通过Group做出来的 ...
- 利用socket.io+nodejs打造简单聊天室
代码地址如下:http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...
- C#实例之简单聊天室(状态管理)
前言 状态管理是在同一页或不同页的多个请求发生时,维护状态和页信息的过程.因为Web应用程序的通信协议使用了无状态的HTTP协议,所以当客户端请求页面时,ASP.NET服务器端都会重新生 ...
随机推荐
- Xcode 获取本地IP
// // // #define MAXADDRS 32 extern char *ip_names[MAXADDRS]; void InitAddresses(); void GetIPAddres ...
- 回溯算法_01背包问题_Java实现
原文地址:http://blog.csdn.net/ljmingcom304/article/details/50314839 本文出自:[梁敬明的博客] 1.回溯算法 回溯算法也叫试探法,通俗的将就 ...
- mysql 提权总结
1.MOF提权 简单的说mof就是系统内部的一个程序,每隔一定时间系统就会以root权限去执行,我们将其替换然后执行我们的而已攻击代码.此举称之为mof提权. 以下便是脚本: #pragma name ...
- S3C6410 SPI全双工读写流程分析(原创)【转】
转自:http://blog.csdn.net/hustyangju/article/details/21165721 原创博文,知识共享!转载请注明出处:http://blog.csdn.net/h ...
- C# Selenium with PhantomJSDriver get image width and height (获取图片的长和高)
//get image width and height var image=driver.FindElement(By.ClassName("it-Header_authorImage&q ...
- HDU 6195 2017沈阳网络赛 公式
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6195 题意:有M个格子,有K个物品.我们希望在格子与物品之间连数量尽可能少的边,使得——不论是选出M个 ...
- 用js实现登录的简单验证
实现过程示意图 代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- BeanUtils简化数据封装
BeanUtils主要用来封装JavaBean的. 1.什么是JavaBean JavaBean指的是标准的类. 要求: 1. 类必须被public修饰2. 必须提供空参的构造器3. 成员变量必须使用 ...
- beego学习笔记(4):开发文档阅读(1)
1.beego的设计是高度模块化的.每个模块,都可以单独使用.一共八大模块: cache;session;log;orm;context;httplibs;toolbox 2.beego的执行逻辑 3 ...
- hive的窗口函数cume_dist、fercent_rank
一.cume_dist 这两个序列分析函数不是很常用,这里也介绍一下.注意: 序列函数不支持WINDOW子句. 数据准备: d1,user1, d1,user2, d1,user3, d2,user4 ...