3

XMLHTTPオブジェクトを使用して非同期リクエストをサーバーに送信するVBAマクロのセットを作成しています。基本認証を送信しています:

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ほとんどのブラウザで動作し、Firefox でのみ動作し、IE では動作しないようPragmaです (理由はわかりません...)

If-Modified-Sinceこれは、IE が独自のアルゴリズムで異なる設定を使用して、要求をキャッシュするかどうかを決定するためです。XMLHttpRequest は、HTTP 応答と同じように扱われていないようです。

注意: このコードでは、新しいオブジェクトが作成されるたびに必要 usernameになります。passwordおそらく、新しいオブジェクトを作成し、一度インスタンス化してから、使用後に破棄する必要があります。その間に、1 つの認証のみを使用して、すべてのリクエストをさまざまな機能で処理します。


ソース

MSDN setRequestHeader メソッド

MSDN IXMLHTTPRequest

XMLHTTPREQUEST キャッシング テスト

XMLHttpRequest とキャッシング

于 2012-07-23T15:17:12.300 に答える