Seesion在C++服務端的使用方法
前面介紹了cookie和session兩種機制的產生和使用過程(可以關注 CPP後臺伺服器 公眾號檢視),但是,似乎在我們C++後臺開發過程中遇見的很少;
那session在我們服務端是怎麼使用的呢?
首先,我們看一個需求:
客戶第一次設定登陸後,以後再次登陸的時候,想要使用快捷登陸或者是一鍵登陸,比如我們使用指紋登陸,即可獲取我們的賬戶資訊
根據這個需求我們做一個方案進行解決,底層實現我們可以使用session的思想;
方案:
說明 :
- 使用者快捷登陸時,根據快捷登陸的ID碼在redis中查詢
- 如果再redis中不存在,則建立session,與使用者的id繫結;如果存在,則登陸成功,呼叫相關功能顯示使用者資訊
- session的產生一般每個公司都會有自己改造的一套方案,這樣可以提升安全性,這裡就使用原生的MD5介面
關於redis鍵值對的設計,一般都比較簡單,建議大家可以自己設計一套,並且實現這個功能;
這裡,簡單展示一下 sessionid 的生成:
#pragma once #include <iostream> #include <openssl/md5.h> #include <string.h> using namespace std; class Md5 { public: Md5(); ~Md5(); bool SetMd5(string data); unsigned char* GetMd5(); private: MD5_CTX ctx; unsigned char outMd5[16]; }; #include "Md5.h" Md5::Md5() { } Md5::~Md5() { } unsigned char* Md5::GetMd5() { //陣列初始化 memset(outMd5,0x00,sizeof(outMd5)); int res = MD5_Final(outMd5,&ctx); if(res != 1) { cout<<"Md5_Final is errpr"<<endl; } return outMd5; } bool Md5::SetMd5(string data) { //初始化Md5 MD5_Init(&ctx); //計算Md5 int res = MD5_Update(&ctx,data.c_str(),5); if(res != 1) { cout<<"Md5_Update is errpr"<<endl; return false; } return true; } #pragma once #include <iostream> #include <stdlib.h> #include <stdio.h> #include "string.h" #include "Md5.h"
using namespace std;
class Session { public: Session(); ~Session(); Session(string UserName,int ID); bool SetId(); int GetId(); bool SetUserName(); string GetUserName(); bool SetSessionId(); bool SetSessionData(); string GetSessionData(); unsigned char* GetSessionId(); private: string name; int id; string SessionData; Md5 md5; }; #include "session.h" Session::Session() { } Session::~Session() { } Session::Session(string UserName,int ID) { this->id = ID; this->name = UserName; } int Session::GetId() { return this->id; } string Session::GetUserName() { return this->name; } bool Session::SetSessionData() { char str[20]; memset(str,sizeof(str)); //這裡使用name+id的方式,生成最終的sessionid sprintf(str,"%d",GetId()); SessionData = GetUserName()+str; return true; } string Session::GetSessionData() { if(!SessionData.empty()) return SessionData; } unsigned char* Session::GetSessionId() { return md5.GetMd5(); } bool Session::SetSessionId() { bool res = md5.SetMd5(GetSessionData()); if(!res) return false; return true; } #include "session.h" int main() { unsigned char* str = new unsigned char[16]; Session session("test",10); session.SetSessionData(); session.SetSessionId(); str = session.GetSessionId(); for(int i=0;i<16;i++) { printf("%02X",str[i]); } printf("\n"); return 0; } CXX = g++ -std=c++11 CFLAG = -g -lssl -lcrypto target = test OBJ = Md5.cpp main.cpp session.cpp $(target):$(OBJ) $(CXX) -o $@ $^ $(CFLAG) clean: rm -f $(target)
補充知識點:
session原理:
使用者使用瀏覽器第一次向伺服器傳送請求,伺服器在接受到請求後,呼叫對應的 Servlet 進行處理。在處理過程中會給使用者建立一個session 物件,用來儲存使用者請求處理相關的公共資料,並將此 session 物件的 JSESSIONID 以 Cookie 的形式儲存在瀏覽器中 (臨時儲存,瀏覽器關閉即失效)。使用者在發起第二次請求及後續請求時,請求資訊中會附帶JSESSIONID,伺服器在接收到請求後, 呼叫對應的Servlet 進行請求處理,同時根據 JSESSIONID 返回其對應的session 物件。
特點:
由伺服器進行建立
每個使用者獨立擁有一個session
預設儲存時間為 30 分鐘作用:
解決了一個使用者的不同請求的資料共享問題。
使用:
建立Session 物件
儲存資料到session 物件獲取session 物件
獲取資料從session 物件
如果獲取session 中不存在的資料返回null。
總結
到此這篇關於Seesion在C++服務端的使用方法的文章就介紹到這了,更多相關session C++服務端內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!