Msxml2.XMLHTTP Msxml2.ServerXMLHTTP与缓存

用 VBS 发送 HTTP 请求时,首先想到的一般是 Msxml2.XMLHTTP(Microsoft.XMLHTTP 已经不提倡使用了)。
 
在大部分情况下,Msxml2.XMLHTTP 能够很好地完成工作,因为它是有缓存的。比如,我们用 Msxml2.XMLHTTP 发送 HTTP POST 请求模拟登陆了某个网站,它会把登陆时的 Cookie 和 Session 缓存下来,当我们想获取网站的数据时直接 HTTP GET 就行了,不需要人工发送 Cookie 和 Session。
 
但是,在有些时候,缓存会给我们造成麻烦。比如我们要写一个 VBS 脚本暴力破解某个网站的账号,假设我们已经破解了一个账号,继续破解时,由于缓存的关系,网站会认为我们已经登陆了,这样会干扰我们判断账号是否破解成功。也就是说,当成功破解一个账号后,需要多加几行代码登出这个账号。在这种情况下,就应该使用没有缓存的 Msxml2.ServerXMLHTTP。
 
总结一下就是,如果需要缓存,则用 Msxml2.XMLHTTP;否则应该用 Msxml2.ServerXMLHTTP。
 
上次写过一篇《Msxml2.XMLHTTP Msxml2.ServerXMLHTTP与缓存》,里面说 Msxml2.XMLHTTP 是有缓存的,而 Msxml2.ServerXMLHTTP 是没有缓存的。但是最近写 VBS 脚本的时候发现,这并不正确。
 
 
最近写过几个暴力破解网站账号的 VBS 程序,测试的时候很郁闷的发现 Msxml2.ServerXMLHTTP 有时有缓存,有时却没有缓存,百思不得其解。一位QQ 昵称为“乱码”的网友提醒了我:“我是这么想的,如果当然成功了,先释放这个对象 set ohttp=nothing,这样不就连缓存也没了,然后再创建,不知可行否。”
 
我才发现,在有的程序中储存 Msxml2.ServerXMLHTTP 对象的变量是声明在函数内部的,这样函数结束时这个变量会被释放,于是这时“没有缓存”;而在有的程序中我为了提高效率,将储存 Msxml2.ServerXMLHTTP 对象的变量声明为全局变量,这样可以节省不断创建 Msxml2.ServerXMLHTTP 对象的时间和开销,导致这个对象一直都不会被释放,于是这时就“有缓存”了。
 
Msxml2.XMLHTTP 和 Msxml2.ServerXMLHTTP 的缓存问题已经困扰我很久了,现在终于豁然开朗:这两个对象都是有缓存的,每一个对象被创建后都在内部维护着自己的缓存,直到被释放。所以,如果你需要缓存时,就把它们声明为全局变量;如果你不需要缓存,就声明为局部变量以自动释放内存,或者自己手动释放。
 
 
再总结一下:要想使用Session 和cookiess都是扯淡。按照我的理解,服务器与第3方网站建立连接后,session和cookiess实际上都存在了服务器上,并不能给你的浏览器带来session 或者cookiess。所以浪费了N天,放弃。
 
 

 

评论

发表新评论

此内容将保密,不会被其他人看见。
点击刷新验证码
  • 可用的 UBB 标签:
  • 留言最长字数:1000。