我已经声明了一个类Input_output_class()
的静态成员变量Session :: Ptr c_pSecureSession = nullptr;
对于每个请求GET / PUT / DELETE / HEAD,我必须创建一个Input_output_class()类的对象。在类的成员函数中 我正在创建一个如下会话 函数Get()
{
if(c_pSecureSession)
{
s_sess = HTTPSClientSession(host, port, pContext, c_pSecureSession);
}
else
{
s_sess = HTTPSClientSession(host, port, pContext);
}
//pContext is a defaultClientContext from singleton Poco::Net::SSLManager
s_sess->sendRequest(request);
c_pSecureSession = s_sess->sslSession();
cout <<" c_pSecureSession " << c_pSecureSession <<endl;
//Handle response below
}
SSL MANAGER Singleton初始化代码 ------
{
Poco::SharedPtr<Poco::Net::InvalidCertificateHandler> ptrHandler = new Poco::Net::AcceptCertificateHandler(false);
Poco::Net::Context::Ptr ptrContext = new Poco::Net::Context(Poco::Net::Context::CLIENT_USE, "");
ptrContext->enableSessionCache(true);
Poco::Net::SSLManager::instance().initializeClient(0, ptrHandler, ptrContext);
}
我看到该会话没有被重用,我正在为每个请求获取一个新的c_pSecureSession指针。
你能帮我解决一下如何使用会话缓存..
感谢。
答案 0 :(得分:0)
首先,基础知识 - c_pSecureSession
是Poco::AutoPtr
,因此每次都会有不同的实例。然而,底层裸指针将始终是相同的 - 这是智能指针范例背后的想法 - 许多智能指针包裹一个“裸”指针。
从您发布的代码中不清楚您如何“重复使用”nullptr
Session
- 为此,您必须先手动创建Session
(但是,如果你还没有套接字?),或者首先创建一个HTTPSClientSession
,然后从那里获取后续的(可行的)。
但是,让我们简单一点 - 您不需要c_pSecureSession
而且您不需要为每个请求重新创建会话 - 只创建一次:
s_sess = HTTPSClientSession(host, port, pContext);
由于您已经为上下文启用了缓存,s_sess
中的基础会话将被重用,只需从中发送/接收。
请注意,为了缓存会话,还必须在服务器端启用缓存,并且会话也可能具有到期时间 - 如果基础会话到期,将自动重新创建新的。
有关如何处理会话的示例,请参阅testCachedSession。