curl中对应cookie的管理

来源:互联网 发布:图片归类整理软件 编辑:程序博客网 时间:2024/06/16 12:42

curl中,对于cookie的管理,取决于是否有 CURL_DISABLE_COOKIES宏,如果没有定义,那么就是需要处理cookie的。

curl内部使用Cookie和CookieInfo两个struct保存cookie信息。 为一个easy handle设置CURLOPT_SHARE选项,并且指定的share handle启用了cookie共享功能, 则easy handle会使用share handle中的共享cookie列表。


下面就说一下共享cookie以及出现的问题:

问题:

在首次和服务器交互的时候,是没有cookie的信息的,当服务器返回应答中,携带了Set-Cookie:,那么此时cookie被保存到共享cookie中,那么在程序结束之前,只要服务器没有重新携带 Set-Cookie: ,那么客户端会在每次会话中都携带。那么,想在新会话建立的时候,不使用上一次的cookie,怎么办么?


cookie的保存过程:

1、查看共享cookie是怎么创建的。

在 curl_context_init() 中,初始化了一些全局句柄,包括 global_context->shareHandle 共享句柄,global_context->shareHandle = curl_share_init(),这个句柄是程序结束之前,一直存在不销毁的。

2、设置共享cookie信息。

在curl_share_setopt()中,通过 CURL_LOCK_DATA_COOKIE这个宏,调用 Curl_cookie_init() 去初始化cookie,同时返回值作为 share->cookies 保存。

3、当客户端和服务器结束当前对话,那么 Curl_cookie_cleanup() 情况当前保存的cookie变量,下一次重新建立会话的时候,从 curl_session_create() 开始,判断全局共享cookie是否存在,如果存在,那么当前cookie就等于全局保存的共享cookie。也就是此次新建立的会话,用的是上一次保存的cookie。


解决办法:

因为每次会话,都是从curl_session_create() 开始的,同时共享cookie在程序结束之前,并没有清空,因此,应该在会话开始的时候,清空全局共享cookie,重新初始化。

具体解决过程: curl_session_create()中,调用 curl_share_setopt(),对 global_context->shareHandle 句柄,设置 CURL_LOCK_DATA_COOKIE 的 CURLSHOPT_SHARE 属性,然后此时检查,如果 share->cookies 不为空,那么清空,Curl_cookie_cleanup(share->cookies),然后重新 share->cookies = Curl_cookie_init(NULL, NULL, NULL, TRUE ) 初始化,这样每次新建立的会话,cookie都是从空开始,保证不受上一次cookie的干扰。  



原创粉丝点击