curl中对应cookie的管理

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的干扰。   



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值