导图社区 探花交友思维导图
本图梳理了JavaEE后端项目探花交友开发实战,包括系统对接、核心框架、分布式集群、数据库与缓存、安全技术、SSO单点登录系统。
社区模板帮助中心,点此进入>>
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
域控上线
python思维导图
css
CSS
计算机操作系统思维导图
计算机组成原理
IMX6UL(A7)
考试学情分析系统
探花交友
项目技术
系统对接
腾讯云COS
即时消息系统
人脸识别系统
Spark大数据推荐系统
核心框架
Maven+SpringBoot
Mybatis+MybatisPlus
分布式集群
nginx+dubbo+zookeeper
反向代理简化请求
缓存分布式服务注册信息
提供内部访问支持
数据库与缓存
MySQL
存储访问低频、敏感、用户核心持久化数据
用户登陆信息
用户个人信息
客户端配置信息
服务器用户黑白名单
平台公告信息
MongoDB
存储访问高频、用户的大量动态、第三方接口对接的持久化数据
如环信用户信息
大数据推荐信息
用户发布动态信息
用户好友关系信息
Redis
缓存访问高频、有时效性的数据
如验证码、频繁访问的Cache数据、id信息
实现MongoDB的自增长ID
ElasticSearch
存储地理位置信息
自定义范围查询
FastDfs
存储用户多媒体信息文件
安全技术
Token采用JWT令牌
防止请求信息被篡改
ThreadLocal
优化Token验证逻辑
全局锁定UserID
日志技术
lombok的Slf4j
多线程技术
异步编程
用户无感知进行后台同步数据,提高用户使用体验
完成功能
SSO单点登录系统
实现
因前端对接需要,需设计响应结果类对象,以及状态码枚举
状态码
1XXXX
第一位默认1,表示服务器响应成功
第二位默认0,本功能在整个项目中的序号,0代表任意
第三位默认0,表示本功能中的controller类的序号,0代表任意
第四位默认0,表示本类中方法的序号,0代表任意
第五位表示本功能中的方法结果状态
结果类
携带数据
消息信息
设计用户表和用户基础信息表
用户表包含主要登录信息,uid,手机号,密码(MD5加密后的)
基础信息表主要包含非登录信息的其他个人信息
发起登录请求时服务器生成验证码存储在Redis中,通过对接腾讯云COS短信系统下发验证码
客户端输入验证码后请求后端验证,后端无论是否成功验证均立即删除redis中的验证码
服务器验证成功后判断是否为新用户,若为新用户则注册,调用人脸识别接口将上传的照片真人认证,完善基础信息,存储用户信息到MySQL持久化,并异步同步第三方即时消息系统等的用户注册服务
将用户id与用户设备信息封装生成JWT令牌存入Token
校验Token: 1.将传入token进行解密,获取id; 2.从Redis查询该id数据信息,若无数据则从MySQL用户表中查出再存入Redis,有效期设置为token剩余有效期; 3.将查出数据封装到user对象返回,解密失败则返回空。
注意
提前与前端约定合适的结果响应信息
MybatisPlus的配置信息务必于MySQL的表库数据一致
尽量避免代码中包含字符串的实例,最好将其封装到配置文件或者枚举类中,以增强维护性,如 验证码有效期,Redis前缀信息等
防止Token被盗用引发CSRF攻击的安全问题
通常验证 HTTP Referer 字段,不能完全解决这个问题
最佳方式是在重要操作增加短信验证码二次验证,以降低token泄漏造成问题的几率
环信即时消息系统
因对接第三方平台数据的差异,需根据开发文档设计新的环信用户表和实体类
实现ThreadLocal接口,对Token进行全局拦截、校验,获取当前用户对象并存储到ThreadLocal中,以便保证安全的前提下,同一线程的不同方法均可快捷调用登录用户信息。
对接环信消息系统的开发文档,选择设计本功能的接口,并实现、注册到远程服务器
获取环信系统管理员权限的Token,存入Redis中,设置有效期比实际有效期少一个小时,并提供Redis缓存意外丢失的自动刷新Token服务
注册用户
调用ThreadLocal中的Uid,查询数据库中的用户信息,生成随机密码,调用环信api同步到环信服务器,并写入环信用户数据表中
查询用户
根据传入用户ID或者用户名从MySQL查询,如无则通过redis调用环信管理员权限,从环信服务器中查询,并返回环信用户对象
添加好友
根据传入用户id与朋友id,通过环信系统提供的接口提交请求,绑定好友关系,并存入本地MySQL好友关系表
删除好友
根据传入用户id与朋友id,通过环信系统提供的接口提交请求,删除好友关系,并修改本地MySQL好友关系表
发送消息
陌生人消息可通过陌生人主页入口,以管理员权限单向发送一条消息,直到对方回复可再次回复消息。
好友关系可通过环信接口任意发送消息。
同步用户
设置定时任务,在每日闲时凌晨2-6点自动同步上传本地用户信息与好友关系到环信服务器
Token全局拦截校验,需注意合理使用自定义注解排除无需Token的方法
ThreadLoad使用后需保证移除存储信息,确保无安全隐患
获取第三方系统的Token,存储有效期需考虑实际有效期。
用户圈子发布动态
设计MongoDB数据表
用户发布表
封装发布动态核心内容
用户相册表
关注用户动态,展示在个人主页,关联发布表内容
好友时间线表
关注好友发布的动态信息,发布动态后通过消息及时通知所有好友,关联好友的发布表内容
通过ThreadLocal获取当前用户信息
将发布的正文,地理位置信息、文件的路径等信息与用户id封装到发布对象中
校验发布对象正文或者用户id是否为空,否则执行发布逻辑,借助Redis实现发布id自增长,并由Redis维护该全局Id
将发布对象信息存入MongoDB发布表和相册表中
使用Spring的Async注解,同时异步执行写入好友时间线表
需要校验发布动态是否为空,避免出现无动态动态。
发布表id需要唯一性,Redis维护id需做好持久化