Cookie和Post/Get参数支持
Author: kagula
Date: 2016-12-28
前言
cookie的支持是基於boost官網下面的例子
C:\SDK\boost_1_72_0\doc\html\boost_asio\example\cpp03\http\server4
其中C:\SDK是我的解壓路徑.
正文
Cookie的支持
如何调用
第一步:所有的TCP请求加入下面的代码
若session不存在,会返回一个新的sessionid
std::string sessionid = kagula::SessionSupport::Instance().parseReq(req);
第二步:往session里读写数据
只要拿到下面的对象,就可以读写session了。
boost::shared_ptr<kagula::SessionInfo> pSI = kagula::SessionSupport::Instance().getSessionInfo(sessionid);
最后一步:修改http返回的代码段,使之能把sessionid写到http客户端里
rep.status = reply::ok;
rep.headers.resize(3);
rep.headers[0].name = "Content-Length";
rep.headers[0].value = boost::lexical_cast<std::string>(rep.content.size());
rep.headers[1].name = "Content-Type";
rep.headers[1].value = mime_types::extension_to_type(extension);
rep.headers[2].name = kagula::reply_set_cookie;
rep.headers[2].value = kagula::SessionSupport::Instance().getSetCookieValue(sessionid);
依赖的代码
SessionSupport.h
#ifndef _SESSION_SUPPORT_H_
#define _SESSION_SUPPORT_H_
#include <boost/shared_ptr.hpp>
#include <boost/thread.hpp>
#include <string>
#include <map>
namespace http {
namespace server4 {
struct request;
}
}
/*
功能:提供Cookie支持,通过Cookie中存放Session ID识别每个不同的用户,维护每个session对应的具体用户状态。
依赖:Boost::ASIO库 示例代码 http::server4中的代码段.
*/
namespace kagula
{
const char req_cookie[] = "Cookie";
const char reply_set_cookie[] = "Set-Cookie";
//服务端只需要在客户端Cookie中存放session id的值,这个session id对应的具体数据
//由服务端维护。
const char session_key[] = "CSessionID";
struct SessionInfo
{
SessionInfo(std::string sessionID):count(0),sessionid(sessionID){}
//存放用户名称、用户角色类型等用户信息。
//这样后面的代码就知道当前session的用户信息。
std::map<std::string, std::string> session;
//存放最后一次XX.html请求,GET Method方式后面跟的请求参数。
//应该在每次执行具体请求处理前调用。
std::map<std::string, std::map<std::string, std::string>> sessionPage;
//
const std::string sessionid;
unsigned count;//每秒+1,如果超过3600s,当前Session被清除。
};
class SessionSupport
{
public:
~SessionSupport();
static SessionSupport& Instance()
{
static SessionSupport ss;
return ss;
}
//响应客户端请求的时候调用,返回session id的具体值,
//如果客户端没有在Cookie中上传session id就分配一个新的sessionid.
//后面的代码可以通过这个session id维护当前session的用户信息。
std::string parseReq(const http::server4::request &req);
//供处理用户请求的时候调用。
boost::shared_ptr<SessionInfo> getSessionInfo(const std::string &sessionID);
//返回信息给客户端之前调用,用来告诉浏览器本服务端的Cookie值设置。
std::string getSe