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 与错误信息

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

相关推荐
郝学胜_神的一滴32 分钟前
CMake 037:宏传递流转机制与C++编译特性跨平台适配指南
c++·cmake
晚安code38 分钟前
缓存击穿、穿透、雪崩一次讲透:附 Redis hotkey 实战
redis
wear工程师39 分钟前
Redis 分布式锁到底靠不靠谱:从 SETNX 到 Redlock,我踩过的坑和业内的争议
redis·面试
apocelipes2 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
vivo互联网技术2 天前
从 10 分钟到 1 秒:ES 深度分页任意跳页的三轮优化实战
服务器·数据库·redis·elasticsearch·深度分页
郝学胜_神的一滴3 天前
CMake 034:生成器表达式:解耦构建时序、精简分支逻辑的终极利器
c++·cmake
见过夏天4 天前
C++ 基础入门完全指南
c++
用户3074596982075 天前
Redis 延时队列详解
redis
烤代码的吐司君5 天前
Redis 数据结构 ZSet, BIT, HyperLogLog,Geo 空间数据
redis·后端