解决nginx如何存储HTTP客户端信息的问题
背景
在web应用软件开发的过程中,服务器端需要存储Session信息来保存HTTP客户端的连接信息。客户端信息包括用户名、用户二维码、二维码时间戳等等。
解决方法
定义一个User结构体存储用户信息。定义一个类,在该类中定义一个static map<string ,User>变量。其中string代表客户端的cookie key ,User代表cookie key对应的用户信息。
示例代码
SessionMap.h
#ifndef _MAP_
#define _MAP_
#include <map>
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
//用户信息
typedef struct userInfo{
userInfo(){
userName="";
userTimeStamp=0;
qrCode ="";
qrTimeStamp =0;
phoneNum="";
passCode="";
codeTimeStamp=0;
certRandomStr="";
certTimeStamp=0;
}
string userName;
int userTimeStamp;
string certRandomStr;
int certTimeStamp;
string qrCode;
int qrTimeStamp;
string phoneNum;
string passCode;
int codeTimeStamp;
}User;
//全局对象类
class Session {
public:
typedef std::map<std::string, User> OpMap;
static void setpair(const string& key,const User& value){
opMap.insert(make_pair(key.c_str(),value));
}
static int getCount(){
return opMap.size();
}
static User getpairValue(const string& key){
map<string,User>::iterator map_it = opMap.find(key.c_str());
if(map_it != opMap.end()){
return map_it->second;
}else{
return User();
}
}
static void updateValue(const string& key,const User& value ){
map<string,User>::iterator map_it = opMap.find(key.c_str());
if(map_it != opMap.end()){
map_it->second = value;
}
}
static void deleteUser(const string& key){
map<string,User>::iterator iter=opMap.find(key.c_str());
if(iter != opMap.end()){
opMap.erase(iter);
}
}
static void printMap(){
for (std::map<string,User>::iterator it=Session::opMap.begin(); it!=Session::opMap.end(); ++it) {
std::cout << it->first <<":"<< it->second.userName << '\n';
}
}
static void getJsonFormatUser( string &userinfo){
Session::deleteUser("");
userinfo="{\"userInfo\": \[";;
for (std::map<string,User>::iterator it=Session::opMap.begin(); it!=Session::opMap.end(); ++it) {
userinfo += "{ \"username\":\"";
userinfo += it->second.userName;
userinfo += "\" },";
}
userinfo.replace(userinfo.length()-1,1,"");
userinfo +="] }";
}
static void deleteUserByName(const string& name){
for (std::map<string,User>::iterator it=Session::opMap.begin(); it!=Session::opMap.end(); ++it) {
if( strcmp(it->second.userName.c_str(),name.c_str())==0 ){
opMap.erase(it);
}
}
}
static string geUserByQrCode(const string& value){
for(map<string,User>::iterator it=Session::opMap.begin(); it!=Session::opMap.end(); ++it) {
string s1 = (it->second.qrCode);
if( strcmp(s1.c_str(),value.c_str()) ==0 ){
return it->first;
}
}
}
public:
private:
static OpMap opMap;
//初始化函数
static OpMap init_map() {
OpMap mapinit;
mapinit[""] = User();
return mapinit;
}
};
#endif
SessionMap.cpp
#include "SessionMap.h"
Session::OpMap Session::opMap = Session::init_map();
用于测试的testMap.cpp
#include "SessionMap.h"
int main(){
User u1;
u1.userName="22222";
Session::setpair("111",u1);
User u2;
u2.userName="daafa22222";
Session::updateValue("111",u2);
User user = Session::getpairValue("111");
cout<<user.userName<<endl;
User u1;
u1.phoneNum = "111111";
return 0;
}
编译
g++ -c SessionMap.cpp testMap.cpp
g++ -o test SessionMap.o testMap.o
运行test可执行文件就可以了。
总结
可以使用类的static成员可以做为全局变量的优点来实现存储系统信息。