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

相关推荐
追光的蜗牛丿2 小时前
C++中引用与指针的选择
开发语言·c++
wsoz2 小时前
Leetcode子串-day4
c++·算法·leetcode
William_wL_2 小时前
【C++】list的实现
c++·list
艾莉丝努力练剑3 小时前
【Linux系统:信号】线程安全不等于可重入:深度拆解变量作用域与原子操作
java·linux·运维·服务器·开发语言·c++·学习
楼田莉子3 小时前
同步/异步日志系统:日志的工程意义及其实现思想
linux·服务器·开发语言·数据结构·c++
kpl_203 小时前
特殊类设计、类型转换和IO流(C++)
c++
牢姐与蒯3 小时前
栈和队列的实现
c++
cccyi73 小时前
【C++ 脚手架】brpc 的介绍与使用
c++·rpc·brpc