12 注冊登錄
整體概述
使用數據庫連接池實現服務器訪問數據庫的功能,使用POST請求完成注冊和登錄的校驗工作。
本文內容
介紹同步實現注冊登錄功能,具體涉及到流程圖、載入數據庫表、提取用戶名和密碼、注冊登錄流程與頁面跳轉的代碼實現。
流程圖,描述服務器從報文中提取出用戶名密碼,并完成注冊和登錄校驗后,實現頁面跳轉的邏輯。
載入數據庫表,結合代碼將數據庫中的數據載入服務器中。
提取用戶名和密碼,結合代碼對報文進行解析,提取用戶名和密碼。
注冊登錄流程,結合代碼對描述服務器進行注冊和登錄校驗流程。
頁面跳轉,結合代碼對頁面跳轉機制進行詳解。
流程圖
描述GET和POST請求下的頁面跳轉流程。
載入數據庫表
將數據庫中的用戶名和密碼載入到服務器的map中來,map中的key為用戶名,value為密碼。
//用戶名和密碼
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,進而提取出用戶名和密碼。
//判斷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
//找到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);