VBA XMLHTTP清除身份验证?

时间:2012-07-17 16:25:41

标签: vba xmlhttprequest

我正在编写一组VBA宏,它使用XMLHTTP对象向服务器发送异步请求。我发送基本身份验证:

XMLHttpReq.setRequestHeader "Authorization","Basic " & Base64EncodedUserPass

第一次这很棒。 但是,如果用户更改其用户ID /密码,即使代码创建了一个全新的XMLHttpReq对象并将此标头设置为新信息,它也会以第一个用户身份登录到服务器,可能来自缓存凭据。

如何让代码“忘记”我之前登录并重新授权?

根据要求

编辑,代码的相关部分;它真的不是很复杂:

myURL = "http://my.domain.com/myscript.cgi"
Dim oHttp As New MSXML2.XMLHTTP
oHttp.Open "POST", myURL, False
oHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded'"
oHttp.setRequestHeader "Authorization","Basic " & Base64EncodedUsernamePassword
oHttp.send "PostArg1=PostArg1Value"
Result = oHttp.responseText

1 个答案:

答案 0 :(得分:5)

由于主流浏览器不同的缓存方法实现,这些问题已经在很多方面进行了讨论。

我会告诉你对我有用的东西,然后是我在功能上找到的来源。

我遇到的唯一解决方案是强制浏览器不缓存请求。

myURL = "http://my.domain.com/myscript.cgi"
Dim oHttp As New MSXML2.XMLHTTP
oHttp.Open "POST", myURL, False
oHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded'"
oHttp.setRequestHeader("Cache-Control", "no-cache");
oHttp.setRequestHeader("Pragma", "no-cache");
oHttp.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
oHttp.setRequestHeader "Authorization","Basic " & Base64EncodedUsernamePassword
oHttp.send "PostArg1=PostArg1Value"
Result = oHttp.responseText

似乎Cache-Control适用于大多数浏览器而Pragma仅适用于Firefox而不适用于IE(不知道原因......)

If-Modified-Since用于IE,因为IE在他自己的算法中使用不同的设置来确定是否应该缓存请求。 XMLHttpRequest似乎不被视为与HTTP响应相同。

小心:使用此代码,每次创建新对象时,您都需要 usernamepassword。也许你应该创建一个新对象,实例化它一次然后在使用后销毁它。在这两者之间,只需一次身份验证,您就可以在不同的功能中处理所有请求。


来源

MSDN setRequestHeader Method

MSDN IXMLHTTPRequest

XMLHTTPREQUEST CACHING TESTS

XMLHttpRequest and Caching