我们的系统使用截图方式获取验证码一直不靠谱,偶尔会报错。为了彻底解决这个问题,想着可以使用发送请求方式直接获取验证码。但是,又出现了新问题,对方服务器一直返回“验证码失效的错误”,弄了很久,最后发现,问题出在cookie的处理上。
获取验证码请求会设置cookie。正常登陆过程,比如登陆页面的webBrowser初始cookie=ck_1,当发送验证码后,webBrowser页面cookie=ck_2。因为我们登录使用webBrowser模拟的方式,而获取验证码使用的http直接请求的方式,所以,发送验证码请求获取验证码图片,我们还需要将当前http返回的cookie写到webBrowser的对应cookie里。可以使用JS的方式:
"document.cookie= c.Name=escape(c.value)"
但是,这样就可以了吗?webBrowser是根据cookie的路径取相应的cookie再发送到服务器进行认证的,但是,上面并没有设置cookie路径,而默认路径是在当前目录下,并不一定是根目录。所以,还需要设置cookie路径:
"document.cookie= c.Name=escape(c.value);path=c.path"
只有cookie的name,path,domain这三个属性都相同,才会被覆盖。取cookie的时候会先尾匹配domian,然后前匹配path。所以,domin或path详细,当名称相同的时候会被优先使用。例如:
cookie_1:"document.cookie= name=sb1;path=/domain=csdn.net"
cookie_2:"document.cookie= name=sb1;path=/tt;domain=csdn.net"
同时存在的时候,会使用cookie_2的值。
可以通过设置cookie有效期,Expire time/Max-age属性,来删除对应的cookie.
使用fiddler分析http请求的时候,有的cookie后面有HTTP-Only标志,这是为了防止窃取cookie的安全机制,设置HTTP-Only后,使用JS不能访问该cookie。
一旦cookies通过Javascript设置后遍不能提取它的选项,所以你将不会知道domain,path,expiration日期或secure标记。因此分析request的cookie的时候,我们只能看到cookie的name和value.
参考资料: