12 注册登录

12 注册登录

整体概述

使用数据库连接池实现服务器访问数据库的功能,使用POST请求完成注册和登录的校验工作。

本文内容

介绍同步实现注册登录功能,具体涉及到流程图、载入数据库表、提取用户名和密码、注册登录流程与页面跳转的代码实现。
流程图 ,描述服务器从报文中提取出用户名密码,并完成注册和登录校验后,实现页面跳转的逻辑。
载入数据库表 ,结合代码将数据库中的数据载入服务器中。
提取用户名和密码 ,结合代码对报文进行解析,提取用户名和密码。
注册登录流程 ,结合代码对描述服务器进行注册和登录校验流程。
页面跳转,结合代码对页面跳转机制进行详解。

流程图

描述GET和POST请求下的页面跳转流程。

载入数据库表

将数据库中的用户名和密码载入到服务器的map中来,map中的key为用户名,value为密码。

cpp 复制代码
//用户名和密码
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;
	}
}

提取用户名和密码

服务器端解析浏览器的请求报文,当解析为POST请求时,cgi标志位设置为1,并将请求报文的消息体赋值给m_string,进而提取出用户名和密码。

cpp 复制代码
//判断http请求是否被完整读入
http_conn::HTTP_CODE http_conn::parse_content(char *text)
{
	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];

char *m_url_real=(char *)malloc(sizeof(char)*200);
strcpy(m_url_real,"/");
strcat(m_url_real,m_url+2);
strncpy(m_real_file+len,m_url_real,FILENAME_LEN-len-1);
free(m_url_real);

//将用户名和密码提取出来
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';

同步线程登录注册

通过m_url定位/所在位置,根据/后的第一个字符,使用分支语句实现页面跳转。具体的,

  • 0:跳转注册页面,GET
  • 1,跳转登录页面,GET
  • 5,显示图片页面,POST
  • 6,显示视频页面,POST
  • 7,显示关注页面,POST
cpp 复制代码
//找到url中/所在的位置,进而判断/后第一个字符
const char *p=strrchr(m_url,'/');

//注册页面
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);
}

//登录页面
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);
}

//否则发送url实际请求的文件
else 
	strncpy(m_real_file+len,m_url,FILENAME_LEN-len-1);
相关推荐
Canmag 兴隆磁性6 小时前
中大型钕铁硼产品的磁通测量与自动分选:一条产线自动化的工程实现思路
运维·学习·自动化·永磁材料
小黄人软件8 小时前
桌面需要整理吗?有工具自动分类
学习
老衲不用@飘柔9 小时前
SFP与SFP+学习知识整理
学习
X54先生(人文科技)9 小时前
社会嵌入式终身学习机器与修复时代-ELR架构和技术演化探讨
人工智能·深度学习·学习·架构·开源协议
电子云与长程纠缠10 小时前
UE5魂系游戏开发教程05
开发语言·学习·游戏·ui·ue5
syagain_zsx10 小时前
BRpc 二次封装:Channel 管理、服务管理与回调工厂
c++·学习·程序人生·rpc·谷歌
其实防守也摸鱼10 小时前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全
我命由我1234510 小时前
Python 开发 - Python 的 pathlib
java·开发语言·后端·python·学习·java-ee·学习方法
kkkkkkkkkk_Z11 小时前
新手自学嵌入式 | 学习日记:Linux驱动复习之系统移植(U-Boot篇)
linux·运维·学习
Rabitebla11 小时前
【系统性学习笔记】Linux 权限篇(二):文件属性、权限修改与目录权限的底层逻辑
linux·c++·笔记·学习·算法