为Boost ASIO的http server4例子添加Cookie和Post/Get参数提取支持

本文介绍了如何为Boost ASIO的HTTP Server4添加Cookie和Post/Get参数支持。首先,文章基于Boost官方示例介绍了Cookie的支持,包括如何在TCP请求中处理Session,并读写Session数据。接着,文章详细阐述了如何实现Post/Get参数的提取。参考链接提供了关于Cookie工作原理的进一步阅读。
摘要由CSDN通过智能技术生成

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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kagula086

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值