当前位置: 首页 > news >正文

C++聊天室项目:注册登录接口与 Redis 缓存

本文讲解 C++ 聊天室项目第二部分 ——注册登录接口设计、密码加密、Redis 缓存 Cookie的实现与原理,覆盖 RESTful API、MySQL 用户表、盐值加密、Redis 会话存储等核心知识点。

一、RESTful API 基础原理

RESTful API 是基于 HTTP 协议的接口设计风格,通过GET、POST、PUT、DELETE实现数据的查、增、改、删,具有无状态、资源导向、可缓存等特点,是前后端分离项目的主流接口方案。

1. 设计规范

  • 资源用名词表示,如/v1/user
  • HTTP 方法表示操作:GET 查询、POST 新增、PUT 更新、DELETE 删除
  • 支持筛选、排序、分页参数,示例:
GET /v1/user?sex=male&age>30

该语句表示:查询性别为男、年龄大于 30 的用户数据,?后为查询参数,&连接多条件。

2. 状态码规范

  • 200:请求成功
  • 204:操作成功无返回体
  • 400:请求参数错误
  • 401:未授权
  • 404:资源不存在
  • 500:服务器异常

二、MySQL 用户表设计

用户信息采用独立表存储,包含用户名、邮箱、加密密码、盐值等字段,保证数据安全与查询效率。

DROP TABLE users; CREATE TABLE IF NOT EXISTS users ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL, password_hash CHAR(64) NOT NULL, salt CHAR(32) NOT NULL, create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE (username), UNIQUE (email), INDEX idx_email (email) );
  • password_hash:MD5 加盐后的密码
  • salt:随机盐值,提升密码安全性
  • 唯一约束:避免重复用户名、邮箱注册

三、密码加密与盐值(Salt)

1. 为什么用盐值

直接 MD5 加密相同密码会得到相同结果,易被彩虹表破解。盐值是每个用户独有的随机字符串,加密时拼接在密码后,让相同密码生成不同密文。

2. 加密流程

  1. 用户注册:明文密码 → MD5 → 拼接盐值 → 再次 MD5
  2. 存储:将password_hashsalt一同存入数据库
  3. 登录:使用相同盐值与加密规则验证密码一致性

示例:

md5(md5("123456") + "随机盐值")

3. 注册 / 登录接口

  • 注册接口(POST):/api/create-account,参数:username、email、MD5 密码
  • 登录接口(POST):/api/login,参数:email/username、MD5 密码
  • 成功:返回 204 并在 Header 设置 Cookie
  • 失败:返回 400 与错误信息

四、Redis 缓存 Cookie 实现会话管理

1. Redis 作用

Redis 是基于内存的高性能键值数据库,读写速度极快,适合存储会话、缓存等短时数据。本项目用 Redis 缓存 Cookie,实现登录状态快速校验。

2. 核心流程

  1. 登录成功生成唯一 Cookie(sid)
  2. Redis 存储:key=sid,value = 用户信息 / 邮箱
  3. 设置过期时间,保证会话安全
  4. 前端请求自动携带 Cookie,后端通过 Redis 校验登录状态

3. 常用 Redis 命令

# 后台启动Redis redis-server --daemonize yes # 连接Redis客户端 redis-cli # 设置Cookie缓存 set sid:xxxx user:zhou # 获取Cookie对应用户 get sid:xxxx # 查看所有键 keys *

五、项目启动与常见问题

1. 启动顺序

  1. 启动 MySQL:sudo systemctl start mysql
  2. 启动 Redis:redis-server --daemonize yes
  3. 启动后端:./bin/chat-room2 chat-room.conf
  4. 启动前端:npm run dev
  5. 访问:http://127.0.0.1:5173

2. 常见报错

  • Redis 连接失败:未启动 Redis 服务,先执行redis-server
  • 内存崩溃(malloc 错误):WebSocket 连接异常,重启后端即可
  • 磁盘空间不足:清理 npm 缓存与系统日志

六、核心知识点总结

  1. RESTful API:统一接口规范,支持筛选、分页、排序
  2. 盐值加密:提升密码安全性,防止彩虹表破解
  3. MySQL 用户表:结构化存储用户信息,保证唯一性
  4. Redis 缓存:快速存储 Cookie,实现高效会话管理
  5. 前后端交互:JSON 序列化传递数据,Cookie 保持登录状态

https://github.com/0voice

http://www.jsqmd.com/news/595007/

相关文章:

  • 2026横向对比5款H5工具,产品介绍页制作,哪款出片更高级?
  • Windows10下YOLOv8-Pose(8.2.10)从零部署:自定义数据集训练与工程化推理实战
  • 3D点云检测实战-Nuscenes数据集解析与Python工具链深度指南
  • Unity HDRP水系统性能避坑指南:从脚本交互到水下渲染,让你的游戏帧率稳如泰山
  • JVM学习-基础篇-垃圾回收
  • OpenClaw浏览器自动化:Qwen3-14B驱动无头爬虫实战
  • 从零开始用JavaScript Canvas画彩虹:理解arc()绘图与颜色渐变
  • HTB——Oopsie
  • Java SpringBoot+Vue3+MyBatis Web在线考试系统系统源码|前后端分离+MySQL数据库
  • 我的CSDN第一篇
  • OpenClaw+千问3.5-35B-A3B-FP8:自动化商品描述生成器
  • TimeGPT新手必看:5分钟搞定token获取与AirPassengers数据集预测实战
  • OpenClaw性能优化:Qwen3-14B镜像的并发请求控制策略
  • Unity2018中SpriteAtlas与AB包的高效集成实践
  • c++如何利用C++23的std--expected重构文件操作的错误管理代码【实战】
  • 自动化数据清洗:OpenClaw调用千问3.5-9B处理混乱CSV文件
  • STM32F103C8T6 RAM不够用?手把手教你用CAN总线实现边收边写的IAP升级(附完整代码)
  • Unity游戏开发:Highlight Plus 8.0在URP渲染管线下的完整配置指南(含常见问题解决)
  • OpenClaw离线模式探索:Qwen3-14b_int4_awq断网环境下的应急方案
  • OpenClaw日志分析自动化:Qwen3-14b_int4_awq模型驱动的问题排查
  • SEO 对于SaaS产品销售有什么影响
  • 电商运营自动化:OpenClaw驱动千问3.5-27B批量生成商品描述
  • TFT_eSPI_Charts嵌入式图表库:轻量级实时可视化方案
  • Agent、Copilot、Advisor
  • 从无人机抗风到机械臂消振:聊聊ESO(扩张状态观测器)在机器人里的那些实战用法
  • 2026年比较好的易打理进口地板/抗菌进口地板稳定供货厂家推荐 - 品牌宣传支持者
  • OpenClaw高阶用法:Qwen3-14B模型的热切换与A/B测试
  • OpenClaw多模型切换指南:百川2-13B-4bits与Qwen3-32B混合调用
  • 基于SpringBoot + Vue的医院患者就诊数据可视化分析系统(角色:患者、医生、管理员)
  • OpenClaw智能旅行规划:千问3.5-35B-A3B-FP8解析景点照片生成个性化行程表