VBA XMLHTTP清除身份验证?

Jos*_*osh 3 vba xmlhttprequest

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

XMLHttpReq.setRequestHeader "Authorization","Basic " & Base64EncodedUserPass
Run Code Online (Sandbox Code Playgroud)

这是第一次很棒.但是,如果用户更改其用户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
Run Code Online (Sandbox Code Playgroud)

Rom*_*ain 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
Run Code Online (Sandbox Code Playgroud)

它似乎Cache-Control适用于大多数浏览器,Pragma只适用于Firefox而不是IE(不知道为什么......)

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

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


来源

MSDN setRequestHeader方法

MSDN IXMLHTTPRequest

XMLHTTPREQUEST缓存测试

XMLHttpRequest和缓存