springboot md5加密_实在!基于Springboot和WebScoket,写了一个在线聊天小程序

基于Springboot和WebScoket写的一个在线聊天小程序

(好几天没有写东西了,也没有去练手了,就看了看这个。。。)

0603d08be2666b0739fb11eda4f0dda1.png

项目说明

  • 此项目为一个聊天的小demo,采用springboot+websocket+vue开发。
  • 其中有一个接口为添加好友接口,添加好友会判断是否已经是好友。
  • 聊天的时候:A给B发送消息如果B的聊天窗口不是A,则B处会提醒A发来一条消息。
  • 聊天内容的输入框采用layui的富文本编辑器,目前不支持回车发送内容。
  • 聊天可以发送图片,图片默认存储在D:/chat/目录下。
  • 点击聊天内容中的图片会弹出预览,这个预览弹出此条消息中的所有图片。
  • 在发送语音的时候,语音默认发送给当前聊天窗口的用户,所以录制语音的时候务必保证当前聊天窗口有选择的用户。
  • 知道用户的账号可以添加好友,目前是如果账号存在,可以直接添加成功

老规矩,还是先看看小项目的目录结构:

efec7d2fe799de43713cd61aae83fd6b.png

一、先引入pom文件

这里就只放了一点点代码(代码太长了)

commons-io            commons-io            2.4org.projectlombok            lombok        net.sf.json-lib            json-lib            2.4jdk15org.springframework.boot            spring-boot-starter-thymeleaf            2.2.4.RELEASEcom.alibaba            fastjson            1.2.60org.springframework.boot            spring-boot-starter-test            test

二、创建对应的yml配置文件

spring:  profiles:    active: prod
spring:  datasource:    username: root    password: root    url: jdbc:mysql://localhost:3306/chat?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimezone=UTC    driver-class-name: com.mysql.jdbc.Driver    #指定数据源    type: com.alibaba.druid.pool.DruidDataSource    # 数据源其他配置    initialSize: 5    minIdle: 5    maxActive: 20    maxWait: 60000    timeBetweenEvictionRunsMillis: 60000    minEvictableIdleTimeMillis: 300000    validationQuery: SELECT 1    testWhileIdle: true    testOnBorrow: false    testOnReturn: false    poolPreparedStatements: true    #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙    filters: stat,log4j    maxPoolPreparedStatementPerConnectionSize: 20    useGlobalDataSourceStat: true    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500  thymeleaf:    suffix: .html    prefix:      classpath: /templates/    cache: false  jackson: #返回的日期字段的格式    date-format: yyyy-MM-dd HH:mm:ss    time-zone: GMT+8    serialization:      write-dates-as-timestamps: false # true 使用时间戳显示时间  http:    multipart:      max-file-size: 1000Mb      max-request-size: 1000Mb#配置文件式开发mybatis:  #全局配置文件的位置  config-location: classpath:mybatis/mybatis-config.xml  #所有sql映射配置文件的位置  mapper-locations: classpath:mybatis/mapper/**/*.xmlserver:  session:    timeout: 7200

三、创建实体类

这里就不再多说了,有Login,Userinfo,ChatMsg,ChatFriends

abcdb344c033cbd5081b3e2cccaaaaed.png

四、创建对应的mapper(即dao层)还有对应的mapper映射文件

(这里就举出了一个,不再多说)

public interface ChatFriendsMapper {    //查询所有的好友    List LookUserAllFriends(String userid);    //插入好友    void InsertUserFriend(ChatFriends chatFriends);    //判断是否加好友    Integer JustTwoUserIsFriend(ChatFriends chatFriends);    //查询用户的信息    Userinfo LkUserinfoByUserid(String userid);}
<?xml version="1.0" encoding="UTF-8"?>      select userid,nickname,uimg from userinfo where userid in (select a.fuserid from chat_friends a where a.userid=#{userid})            insert into chat_friends (userid, fuserid) value (#{userid},#{fuserid})            select id from chat_friends where userid=#{userid} and fuserid=#{fuserid}            select * from userinfo where userid=#{userid}    

五、创建对应的业务类(即service)

(同样的业务层这里也就指出一个)

@Servicepublic class ChatFriendsService {    @Autowired    ChatFriendsMapper chatFriendsMapper;    public List LookUserAllFriends(String userid){        return chatFriendsMapper.LookUserAllFriends(userid);    }    public void InsertUserFriend(ChatFriends chatFriends){        chatFriendsMapper.InsertUserFriend(chatFriends);    }    public Integer JustTwoUserIsFriend(ChatFriends chatFriends){        return chatFriendsMapper.JustTwoUserIsFriend(chatFriends);    }    public Userinfo LkUserinfoByUserid(String userid){        return chatFriendsMapper.LkUserinfoByUserid(userid);    }}

六、创建对应的控制器

这里再说说项目的接口

  1. /chat/upimg 聊天图片上传接口
  2. /chat/lkuser 这个接口用来添加好友的时候:查询用户,如果用户存在返回用户信息,如果不存在返回不存在
  3. /chat/adduser/ 这个接口是添加好友接口,会判断添加的好友是否是自己,如果添加的好友已经存在则直接返回
  4. /chat/ct 跳转到聊天界面
  5. /chat/lkfriends 查询用户的好友
  6. /chat/lkuschatmsg/ 这个接口是查询两个用户之间的聊天信息的接口,传入用户的userid,查询当前登录用户和该用户的聊天记录。
  7. /chat/audio 这个接口是Ajax上传web界面js录制的音频数据用的接口

(同样就只写一个)

@Controllerpublic class LoginCtrl {    @Autowired    LoginService loginService;    @GetMapping("/")    public String tologin(){        return "user/login";    }    /**     * 登陆     * */    @PostMapping("/justlogin")    @ResponseBody    public R login(@RequestBody Login login, HttpSession session){        login.setPassword(Md5Util.StringInMd5(login.getPassword()));        String userid = loginService.justLogin(login);        if(userid==null){            return R.error().message("账号或者密码错误");        }        session.setAttribute("userid",userid);        return R.ok().message("登录成功");    }}

七、创建对应的工具类以及自定义异常类

  1. 表情过滤工具类
public class EmojiFilter {    private static boolean isEmojiCharacter(char codePoint) {        return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA)                || (codePoint == 0xD)                || ((codePoint >= 0x20) && (codePoint <= 0xD7FF))                || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))                || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));    }    @Test    public void testA(){        String s = EmojiFilter.filterEmoji("您好,你好啊");        System.out.println(s);    }
  1. Md5数据加密类
   static String[] chars = {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};    /**     * 将普通字符串用md5加密,并转化为16进制字符串     * @param str     * @return     */    public static String StringInMd5(String str) {        // 消息签名(摘要)        MessageDigest md5 = null;        try {            // 参数代表的是算法名称            md5 = MessageDigest.getInstance("md5");            byte[] result = md5.digest(str.getBytes());            StringBuilder sb = new StringBuilder(32);            // 将结果转为16进制字符  0~9 A~F            for (int i = 0; i < result.length; i++) {                // 一个字节对应两个字符                byte x = result[i];                // 取得高位                int h = 0x0f & (x >>> 4);                // 取得低位                int l = 0x0f & x;                sb.append(chars[h]).append(chars[l]);            }            return sb.toString();        } catch (NoSuchAlgorithmException e) {            throw new RuntimeException(e);        }    }
  1. 测试数据加密类
public class TestUtil {    @Test    public void testA(){        String s = Md5Util.StringInMd5("123456");        System.out.println(s);    }}

八、引入对应的静态资源文件(这个应该一开始就做的)

a68e2dd982535286b954c9757b95b96d.png

九、自定义一些配置并且注入到容器里面

  1. Druid数据源
@Configurationpublic class DruidConfig {    @ConfigurationProperties(prefix = "spring.datasource")    @Bean    public DataSource druid(){        return new DruidDataSource();    }    //配置Druid的监控    //1.配置要给管理后台的Servlet    @Bean    public ServletRegistrationBean servletRegistrationBean(){        ServletRegistrationBean bean=new ServletRegistrationBean(new StatViewServlet(),"/druid/*");        Map initParams=new HashMap<>();        initParams.put("loginUsername","admin");        initParams.put("loginPassword","admin233215");        initParams.put("allow","");//默认允许ip访问        initParams.put("deny","");        bean.setInitParameters(initParams);        return bean;    }    //2.配置一个监控的filter    @Bean    public FilterRegistrationBean webStarFilter(){        FilterRegistrationBean bean=new FilterRegistrationBean();        bean.setFilter(new WebStatFilter());        Map initParams=new HashMap<>();        initParams.put("exclusions","*.js,*.css,/druid/*");        bean.setInitParameters(initParams);        bean.setUrlPatterns(Arrays.asList("/*"));        return bean;    }}
  1. 静态资源以及拦截器
@Configurationpublic class MyConfig extends WebMvcConfigurerAdapter {    //配置一个静态文件的路径 否则css和js无法使用,虽然默认的静态资源是放在static下,但是没有配置里面的文件夹    @Override    public void addResourceHandlers(ResourceHandlerRegistry registry) {        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");    }    @Bean    public WebMvcConfigurerAdapter WebMvcConfigurerAdapter() {        WebMvcConfigurerAdapter adapter = new WebMvcConfigurerAdapter() {            @Override            public void addResourceHandlers(ResourceHandlerRegistry registry) {                //registry.addResourceHandler("/pic/**").addResourceLocations("file:D:/chat/");                registry.addResourceHandler("/pic/**").addResourceLocations("file:D:/idea_project/SpringBoot/Project/Complete&&Finish/chat/chatmsg/");                super.addResourceHandlers(registry);            }        };        return adapter;    }    @Override    public void addInterceptors(InterceptorRegistry registry) {        //注册TestInterceptor拦截器        InterceptorRegistration registration = registry.addInterceptor(new AdminInterceptor());        registration.addPathPatterns("/chat/*");    }}
  1. WebSocketConfigScokt通信配置
@Configuration@EnableWebSocketpublic class WebSocketConfig {     @Bean    public ServerEndpointExporter serverEndpointExporter() {        return new ServerEndpointExporter();    }}

十、进行测试

这是两个不同的用户

29f6d07cb3bf5002ff93f61d3ed0da29.png
f85fbe356dc8fbc1767ba723ce014274.png

当然了,还可以进行语音,添加好友 今天的就写到这里吧!谢谢! 这里要提一下我的一个学长的个人博客,当然了,还有我的,谢谢

作者:奶思

链接:https://juejin.im/post/5ea7994c5188256da14e972d

来源:掘金

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

suse 启动oracle11g,SuSe10下Oracle11g文件系统模式安装及配置、网络配置与连接

SuSe10下Oracle11g文件系统模式安装及配置、网络配置与连接概述本课程主要讲解oracle数据库软件的安装及配置&#xff0c;以及数据库的创建过程和网络配置与连接等&#xff1b;同时讲解一些数据库安装过程中的常见问题解决办法。注意&#xff1a;本文当中引用的package_name均为…

Python pyenv

一、简介 一般在操作系统中我们会安装多个Python版本&#xff0c;所以在进行Python版本切换时会比较麻烦&#xff0c;pyenv就提供了一种简单的方式&#xff0c;能简易地在多个Python版本中进行切换的工具&#xff0c;它简单而优雅。pyenv有以下功能&#xff1a; 1&#xff09;进…

oracle 增加间隔分区,oracle分区表之间隔分区(oracle 11g) - 漫兮网

范围分区允许用户根据分区键列值的范围创建分区。下面是一个按范围分区表的示例&#xff1a;create table sales6(sales_id number,sales_dt date)partition by range (sales_dt)(partition p0701 values less than (to_date(2007-02-01,yyyy-mm-dd)),partition p0702 values l…

c++ try catch语句_再问你一遍,你真的了解try..catch(finally)吗???

定义首先来看下 MDN 的定义&#xff1a;The try...catch statement marks a block of statements to try and specifies a response should an exception be thrown.try...catch语句标记要执行的语句&#xff0c;并指定一个当有异常抛出时候的响应简短的一句的确描述了try...ca…

lamp架构,搭建一个网络平台

首先更改主机名和 hosts 安装软件包&#xff0c;设置启动服务 设置数据库密码 上传discuz论坛包 将discuz注册的用户名写在mariadb数据库中 解压discuz包 unzip discuz包 -d /var/www/html cd到upload下 cp -rf * /var/www/html 进入数据库 mysql -uroot -p create database…

MyEclipse中SVN的使用方法

1、 加载插件 svn-myeclipse插件site-1.10.2.zip&#xff0c;解压缩后&#xff0c;将文件夹下的所有文件拷贝到MyEclipse安装包下的MyEclipse 8.5\dropins文件夹下&#xff0c;然后重新打开myeclipse&#xff0c;会弹出一个报错窗口&#xff0c;不要管它&#xff0c;关闭后&…

oracle数据泵导出csv文件,数据泵expdp导出遇到ORA-01555和ORA-22924问题的分析和处理...

使用数据泵导出数据库数据时&#xff0c;发现如下错误提示&#xff1a;ORA-31693: Table data object "CAMS_CORE"."BP_EXCEPTION_LOG" failed to load/unload and is being skipped due to error:ORA-02354: error in exporting/importing dataORA-01555:…

Go程序开发---Go环境配置:CentOS6.5+Go1.8标准包安装

1.Go安装 1.1Go的三种安装方式 Go有多种安装方式&#xff0c;可以选择自己习惯的方式进行&#xff0c;这里介绍三种安装方式&#xff1a; 1&#xff09;Go源码安装 2&#xff09;Go标准包安装 3&#xff09;第三方工具安装 这里主要介绍下Go标准包在CentOS6.5系统中的安装方式 …

python矩阵乘法_鱼书——第一章 Python入门

one 第一章1.1 Python是什么Python是一个简单、易读、易记的编程语言&#xff0c;而且是开源的&#xff0c;可以免费地自由使用。Python可以用类似英语的语法编写程序&#xff0c;编译起来也不费力&#xff0c;因此我们可以很轻松地使用Python。特别是对首次接触编程的人士来说…

keepalived vip ping不通_【干货分享】OpenStack LVS负载均衡为什么不通?

背景介绍OpenStack环境Neutron 的安全组会向虚拟机默认添加 anti-spoof 的规则&#xff0c;将保证虚拟机只能发出&#xff0f;接收以本机Port为原地址或目的地址(IP、MAC)的流量&#xff0c;提高了云的安全性。但是LVS等需要绑定VIP的场景&#xff0c;默认流量是被拦截的。需要…

Docker安装ssh,supervisor等基础工具

2019独角兽企业重金招聘Python工程师标准>>> Docker安装ssh&#xff0c;supervisor等基础工具 需要提前下载好官方的ubuntu镜像&#xff0c;我这里使用的是ubuntu:14.04版本&#xff0c;这里安装了一些基础的工具ssh&#xff0c;curl&#xff0c;wget&#xff0c;vi…

nginx集群_windows环境下搭建简单Nginx+Tomcat集群

通俗点将&#xff0c;负载均衡就是因为访问流量太大&#xff0c;导致项目访问不流畅、甚至宕掉&#xff0c;所以通过一种分流的方式来缓解这种情况。一、 工具nginx-1.8.0apache-tomcat-6.0.33二、 目标实现高性能负载均衡的Tomcat集群&#xff1a;三、 步骤1、首先下载Nginx&a…

颜色传感器TCS230及颜色识别电路(转)

摘要 TCS230是美国TAOS公司生产的一种可编程彩色光到频率的传感器。该传感器具有分辨率高、可编程的颜色选择与输出定标、单电源供电等特点&#xff1b;输出为数字量&#xff0c;可直接与微处理器连接。文中主要介绍TCS230的原理和应用&#xff0c;以及色光和白平衡的知识&…

mysql命令行导入和导出数据

首先打开命令窗口,输入命令:mysql -h localhost -u selffabu -p 连接成功后,进行下面的操作 MySQL中导出CSV格式数据的SQL语句样本如下&#xff1a; Sql代码select * from test_info into outfile /tmp/test.csv fields terminated by , optionally enclosed by " esc…

7.组件连线(贝塞尔曲线)--从零起步实现基于Html5的WEB设计器Jquery插件(含源码)...

上节讲到如何创建组件&#xff0c;清除设计器视图&#xff0c;以及设计视图的持久化和恢复&#xff0c;本节将重点讲如何实现组件间的连线&#xff0c;前面章节有提到为了方便从持久化文件中恢复&#xff0c;组件和连线是分别存放的&#xff1a;nodes和lines对象&#xff0c;两…

定位排查工作流的计算结果数据量不符合预期的方法

近期有发现一些用户在咨询&#xff0c;为什么数据从数据源出来后&#xff0c;经过了一些计算&#xff0c;结果不符合预期了。最常见的是说&#xff0c;为什么我的数据在Mysql里有xx条&#xff0c;怎么到MaxCompute里算了下结果变了。因为这是两个不同的系统&#xff0c;我们又没…

canvas 插件_基于canvas的JavaScript 二维码生成工具——QRCanvas

介绍在我们日常的开发中&#xff0c;特别是在现代的社会环境下&#xff0c;二维码的应用可谓是丰富多彩&#xff0c;各种各样让人眼花缭乱的二维码&#xff0c;可见二维码已经渗透进我们生活的方方面面&#xff0c;也可以说目二维码确确实实方便了我们的生活。因为作为开发人员…

消息队列NetMQ 原理分析2-IO线程和完成端口

目录 前言介绍目的IO线程初始化IO线程Proactor启动Procator线程轮询处理socketIOObject总结前言 介绍 [NetMQ](https://github.com/zeromq/netmq.git)是ZeroMQ的C#移植版本,它是对标准socket接口的扩展。它提供了一种异步消息队列,多消息模式,消息过滤&#xff08;订阅&#xf…

VC连接mysql数据库错误:libmysql.lib : fatal error LNK1113: invalid machine 解决方法

VC连接MySQL的配置过程在上一篇博文中&#xff0c;不过当你设置好&#xff0c;以为万事大吉的时候&#xff0c;运行却出现这个错误&#xff1a;libmysql.lib : fatal error LNK1113: invalid machine type。 无效的机器类型&#xff0c;真的是很让人捉急。 发生这个错误的原因是…

linux 内存泄漏 定位,一种内存泄露检查和定位的方法

一个系统后台服务进程&#xff0c;可能包括多个线程&#xff0c;在生成环境下要求系统程序能够稳定长时间稳定运行而不宕机。其中一个基本的前提就是需要保证系统程序不存在内存泄露。那么&#xff0c;该如何判读系统程序是否存在内存泄露呢&#xff1f;如果存在&#xff0c;又…