tinyWebServer 学习笔记——六、注册登录

news2024/11/23 17:15:18

文章目录

  • 一、基础知识
  • 二、代码解析
    • 1. 载入数据库表
    • 2. 提取用户名和密码
    • 3. 同步线程登录注册
    • 4. 页面跳转
  • 参考文献

一、基础知识

1

流程图 [1]

二、代码解析

1. 载入数据库表

// 用户名和密码
map<string, string> users;

// 初始化数据库
void http_conn::initmysql_result(connection_pool *connPool)
{
    // 先从连接池中取一个连接
    MYSQL *mysql = NULL;
    connectionRAII mysqlcon(&mysql, connPool);

    // 在user表中检索username,passwd数据,浏览器端输入
    if (mysql_query(mysql, "SELECT username, passwd FROM user"))
    {
        LOG_ERROR("SELECT error: %s\n", mysql_error(mysql));
    }

    // 从表中检索完整的结果集
    MYSQL_RES *result = mysql_store_result(mysql);

    // 返回结果集中的列数
    int num_fields = mysql_num_fields(result);

    // 返回所有字段结构的数组
    MYSQL_FIELD *fields = mysql_fetch_fields(result);

    // 从结果集中获取下一行,将对应的用户名和密码,存入map中
    while (MYSQL_ROW row = mysql_fetch_row(result))
    {
        string temp1(row[0]);
        string temp2(row[1]);
        users[temp1] = temp2;
    }
}

2. 提取用户名和密码

// 主状态机,判断http请求是否被完整读入
http_conn::HTTP_CODE http_conn::parse_content(char *text)
{
    // 判断buffer中是否读取了消息体
    if (m_read_idx >= (m_content_length + m_checked_idx))
    {
        // 标记已读完的部分
        text[m_content_length] = '\0';
        // POST请求中最后为输入的用户名和密码
        m_string = text;
        // 还需读取请求
        return GET_REQUEST;
    }
    return NO_REQUEST;
}

// 根据标志判断是登录检测还是注册检测,即/符号后的第一位
char flag = m_url[1];
// 申请url空间
char *m_url_real = (char *)malloc(sizeof(char) * 200);
// 存入/
strcpy(m_url_real, "/");
// 存入/后的第二位之后的url
strcat(m_url_real, m_url + 2);
// 文件存储区在文件路径之后存入真实url
strncpy(m_real_file + len, m_url_real, FILENAME_LEN - len - 1);
// 释放真实url存储空间
free(m_url_real);

// 将用户名和密码提取出来
// user=123&passwd=123
char name[100], password[100];
int i;
for (i = 5; m_string[i] != '&'; ++i)
    name[i - 5] = m_string[i];
name[i - 5] = '\0';

int j = 0;
for (i = i + 10; m_string[i] != '\0'; ++i, ++j)
    password[j] = m_string[i];
password[j] = '\0';

3. 同步线程登录注册

if (cgi == 1 && (*(p + 1) == '2' || *(p + 1) == '3'))
{
    if (*(p + 1) == '3')
    {
        // 如果是注册,先检测数据库中是否有重名的
        // 没有重名的,进行增加数据
        char *sql_insert = (char *)malloc(sizeof(char) * 200);
        strcpy(sql_insert, "INSERT INTO user(username, passwd) VALUES(");
        strcat(sql_insert, "'");
        strcat(sql_insert, name);
        strcat(sql_insert, "', '");
        strcat(sql_insert, password);
        strcat(sql_insert, "')");
        // 没找到则insert数据
        if (users.find(name) == users.end())
        {
            m_lock.lock();
            int res = mysql_query(mysql, sql_insert);
            users.insert(pair<string, string>(name, password));
            m_lock.unlock();

            if (!res)
                strcpy(m_url, "/log.html");
            else
                strcpy(m_url, "/registerError.html");
        }
        else
            strcpy(m_url, "/registerError.html");
    }
    // 如果是登录,直接判断
    // 若浏览器端输入的用户名和密码在表中可以查找到,返回1,否则返回0
    else if (*(p + 1) == '2')
    {
        if (users.find(name) != users.end() && users[name] == password)
            strcpy(m_url, "/welcome.html");
        else
            strcpy(m_url, "/logError.html");
    }
}

4. 页面跳转

// 如果请求资源为/0,表示跳转注册界面
if (*(p + 1) == '0')
{
    char *m_url_real = (char *)malloc(sizeof(char) * 200);
    strcpy(m_url_real, "/register.html");
    strncpy(m_real_file + len, m_url_real, strlen(m_url_real));

    free(m_url_real);
}
// 如果请求资源为/1,表示跳转登录界面
else if (*(p + 1) == '1')
{
    char *m_url_real = (char *)malloc(sizeof(char) * 200);
    strcpy(m_url_real, "/log.html");
    strncpy(m_real_file + len, m_url_real, strlen(m_url_real));

    free(m_url_real);
}
// 指向图片页面
else if (*(p + 1) == '5')
{
    char *m_url_real = (char *)malloc(sizeof(char) * 200);
    strcpy(m_url_real, "/picture.html");
    strncpy(m_real_file + len, m_url_real, strlen(m_url_real));

    free(m_url_real);
}
// 指向视频页面
else if (*(p + 1) == '6')
{
    char *m_url_real = (char *)malloc(sizeof(char) * 200);
    strcpy(m_url_real, "/video.html");
    strncpy(m_real_file + len, m_url_real, strlen(m_url_real));

    free(m_url_real);
}
// 指向粉丝页面
else if (*(p + 1) == '7')
{
    char *m_url_real = (char *)malloc(sizeof(char) * 200);
    strcpy(m_url_real, "/fans.html");
    strncpy(m_real_file + len, m_url_real, strlen(m_url_real));

    free(m_url_real);
}
// 指向原始路径
else
    strncpy(m_real_file + len, m_url, FILENAME_LEN - len - 1);

参考文献

[1] 最新版Web服务器项目详解 - 12 注册登录

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

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

相关文章

关于 Spring 中事务的嵌套,你了解多少?

Spring事务的的详细理解&#xff0c;事务嵌套解析&#xff0c;以及事务失效的场景解惑 想要了解Spring的事务嵌套&#xff0c;我们先了解一下Spring的七种事务传播属性各自表示的意思 propagation_requierd&#xff1a;如果当前没有事务&#xff0c;就新建一个事务&#xff0c…

简单的TCP网络程序·单进程(后端服务器)

目录 文件1&#xff1a;tcpServer.cc 文件2&#xff1a;tcpServer.hpp 1.提出日志概念 -- 在后续完善 日志格式 -- 暂定简单的打印功能 2.创建套接字 SOCK_STREAM -- socket参数 3.bind自己的套接字 4.设置socket 为监听状态 * 新接口1&#xff1a;listen 函数1&…

Spring Boot进阶(46):集成Jackson之快速入门 | 超级详细,建议收藏

1. 前言&#x1f525; 在上一期《SpringBoot之Jackson配置全局时间日期格式》文中提到Jackson&#xff0c;了解到有很多小伙伴对它很感兴趣&#xff1b;顾这一期&#xff0c;我就重点带着大家以最基础的教学方式领大家入门&#xff0c;废话不多说&#xff0c;咱们这就开始。 这…

(字符串) 925. 长按键入 ——【Leetcode每日一题】

❓925. 长按键入 难度&#xff1a;简单 你的朋友正在使用键盘输入他的名字 name。偶尔&#xff0c;在键入字符 c 时&#xff0c;按键可能会被长按&#xff0c;而字符可能被输入 1 次或多次。 你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字&#xff08;…

【大学物理实验】表面张力

文章目录 选择题选择题 液体表面张力只存在与液体的: A. 内部 B. 底部 C. 表面 D. 表面和内部 正确答案: C 本实验中,下面哪一件测量仪器(工具)是不需要的: A. 力敏传感器 B. 数字电压表 C. 游标卡尺 D. 物理天平 正确答案: D 关于吊环从液体中拉脱力(即最大表面张力)…

距离和相似性度量

文章目录 1. 距离度量1.1 欧几里得距离(Euclidean Distance)1.2 明可夫斯基距离(Minkowski Distance)1.3 曼哈顿距离(Manhattan Distance)1.4 切比雪夫距离(Chebyshev Distance)1.5 马哈拉诺比斯距离(Mahalanobis Distance) 2. 相似性度量2.1 向量空间余弦相似度(Cosine Simila…

盘点五种最常用加密算法!

大家好&#xff0c;我是老三&#xff0c;大家都知道我是一个臭做支付的&#xff0c;支付常常要和一些加签、验签&#xff0c;加密、解密打交道&#xff0c;今天&#xff0c;就给大家来盘点一下最常见的5种加密算法。 前言 大家平时的工作中&#xff0c;可能也在很多地方用到了…

封神榜科技成果 - 国产训练大模型

封神榜科技成果 Fengshenbang 1.0: 封神榜开源计划1.0中英双语总论文&#xff0c;旨在成为中文认知智能的基础设施。 BioBART: 由清华大学和IDEA研究院一起提供的生物医疗领域的生成语言模型。(BioNLP 2022) UniMC: 针对zero-shot场景下基于标签数据集的统一模型。(EMNLP 2022)…

STM32单片机(六)TIM定时器 -> 第三节:TIM输出比较

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

『2023北京智源大会』视觉与多模态大模型

『2023北京智源大会』视觉与多模态大模型 文章目录 一. Drag Your GAN: Interactive Point-based Manipulation on the Generative Image Manifold | 潘新钢 | 南洋理工大学1. Image Manipulation(图像编辑)背景2. Drag Your GAN 二. Machine Learning for 3D Content Creatio…

实验篇(7.2) 14. 站对站安全隧道 - 多条隧道负载均衡(上)(FortiGate-IPsec) ❀ 远程访问

【简介】IPsec VPN虽然价廉物美&#xff0c;但是由运营商原因&#xff0c;经常会出访问慢、不稳定甚至断开的情况&#xff0c;好在现在大多数企业都有二条甚至更多条宽带&#xff0c;我们可以创建多条IPsec VPN&#xff0c;来保证正常访问。 实验要求与环境 OldMei集团深圳总部…

友盟分享之新浪微博站(签名apk下载)

适用环境&#xff1a; 1 单独集成新浪微博分享 2 友盟分享新浪微博 集成步骤&#xff1a; 1 注册新浪微博开发者账号 新浪微博开放平台-首页 2 选择要接入的应用类型 根据官网提示输入对应资料&#xff0c;进行申请 4 创建应用的时候&#xff0c;Android需要输入签名&#x…

NFC无源电子墨水屏

NFC电子纸造就无源可视 电子墨水标签 NFCE-paper For NFC Batteryless E-ink Tag 产品参数 产品型号 PN29_S 尺寸(mm) 95*46.4*5.4mm 显示技术 电子墨水屏 显示区域(mm) 29(H) * 66.9(V) 分辨率(像素) 296*128 像素尺寸(mm) 0.227*0.226 显示颜色 黑/白 视…

摩尔定律放缓后,AMD应如何引领自适应的风潮?

编者按&#xff1a;自适应计算如何为核心市场带来动力&#xff1f;近日&#xff0c;在AMD“自适应和嵌入式产品技术日”活动日上&#xff0c;AMD 全球副总裁唐晓蕾表示&#xff0c;创新是驱动发展的引擎&#xff0c;百行百业的数字化与智能化转型离不开创新输送的源源不断的强劲…

【监控】Zabbix:企业级开源监控解决方案

文章目录 一、zabbix的基本概述二、zabbix的构成三、zabbix的监控对象四、zabbix的常用术语五、zabbix的工作流程六、zabbix进程详解七、zabbix的监控框架7.1 三种架构模式的架构图如下&#xff1a;7.2 每个模块的工作职责&#xff1a; 八、zabbix源码安装及部署一、服务端安装…

电子工程师,一起来聊聊PCB板上的Mark点吧

在PCB设计中&#xff0c;电子工程师需要注意很多方面&#xff0c;新手工程师经常会忽略Mark点&#xff0c;但资深工程师们却对Mark点又爱又恨&#xff0c;甚至不得不花时间耗费在Mark点上&#xff0c;为什么Mark点如此重要&#xff1f;该如何设计Mark点&#xff1f; 一、Mark点…

Linux基础IO - 文件系统 | 软硬链接

之前的文章中我们与文件有关的内容谈论的都是被打开的文件&#xff0c;那么如果文件没有被打开呢&#xff1f;这样文件就一定不再内存中&#xff0c;只能在磁盘外设中存储&#xff0c;本文中我们就来讲述磁盘中文件的相关知识。 磁盘的物理存储结构 一个磁盘由多个盘片叠加而…

如何撰写高效且实用的Prompt

很多人说GPT并没有什么让人惊艳的地方&#xff0c;但实际上&#xff0c;他们并没有发挥好它的潜能。在很多情况下&#xff0c;他们往往没有使用恰当的prompt。一个恰到好处的prompt就如同魔法师在施展魔法时所需要吟唱的咒语&#xff0c;只有那些正确无误的咒语&#xff0c;才能…

Zstack实习-基础知识总结归纳-持续更新

什么是虚拟化&#xff1f; 虚拟化技术是一种将物理计算资源&#xff0c;如服务器、存储和网络等&#xff0c;转化成虚拟的逻辑资源的技术。通过虚拟化技术&#xff0c;可以将多个独立的操作系统运行在同一台物理计算机上&#xff0c;实现资源的共享&#xff0c;提高硬件的利用率…

商业智能之“道、法、器”——企业级BI能力构建指南

一个企业级BI项目看似简单&#xff0c;但实际建设难度却远超想象。如何从0到1搭建BI项目&#xff0c;有没有详细的实施步骤&#xff0c;有没有合适的BI工具推荐&#xff0c;这是很多企业在上BI系统前心中的疑问。因此&#xff0c;本文会详细探讨企业BI能力构建&#xff0c;到底…