3

我正在编写一组 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
4

1 回答 1

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 响应不同。

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


来源

MSDN setRequestHeader 方法

MSDN IXMLHTTPRequest

XMLHTTPREQUEST 缓存测试

XMLHttpRequest 和缓存

于 2012-07-23T15:17:12.300 回答