共用方式為


WinHTTP 中的 Cookie 處理

HTTP 會話數據會在要求或回應的 Cookie 標頭中的用戶端和伺服器之間傳遞。 伺服器會在回應的 Set-cookie 標頭中將 Cookie 傳送至用戶端,而 WinHTTP API 會將伺服器 Cookie 重新傳送至要求之 Cookie 標頭中的伺服器。 rfc 2109 (HTTP 狀態管理機制) 中所述的 Cookie 處理規格預設會在 WinHTTP 中實作。 WinHTTP 不支援 rfc 2964 中所述的最新 Cookie 處理規格。

WinHTTP 會從伺服器 Set-Cookie 標頭取得 Cookie,並將它儲存在每個會話的快取中。 此 Cookie 會在目標符合 Cookie 來源的相同 WinHTTP 會話中,對後續要求重新傳送。 WinHTTP API 會針對要求中的每個回合重新產生要求 Cookie 標頭。

下列清單描述 WinHTTP 用戶端應用程式可用來處理 Cookie 的數個選項:

  • 自動 Cookie 處理 - WinHTTP 會自動處理 Cookie,而用戶端應用程式不會執行任何自定義 Cookie 處理。
  • 停用自動 Cookie 處理 - WinHTTP API 中的自動 Cookie 處理已停用,且不會傳送任何 Cookie。
  • 手動指定所有 Cookie – 自動 Cookie 處理已停用,用戶端應用程式會針對會話中的每個要求新增或移除所有 Cookie 標頭。
  • 手動和自動 Cookie 處理 - 結合自動和手動 Cookie 處理。

若要停用 Cookie 處理,WinHTTP 用戶端應用程式會呼叫 WinHttpSetOption 函式,並將 dwOption 參數設定為 WINHTTP_OPTION_DISABLE_FEATURE,並將 lpBuffer 參數設定為 WINHTTP_DISABLE_COOKIEShInternet 參數必須是請求句柄。 在已傳送先前請求的請求句柄上停用 Cookie 處理時,客戶端應該先在送出下一個請求之前手動移除現有的請求 Cookie 標頭,這需要使用 WinHttpAddRequestHeaders 函式。 如需詳細資訊,請參閱 移除 cookie 標頭

注意

在停用自動模式之後,用戶端應用程式必須在會話上設定所有 Cookie。

手動指定所有 Cookie

停用自動 Cookie 處理時,WinHTTP 用戶端應用程式可以選擇手動指定所有 Cookie。 若要手動設定 Cookie,應用程式會呼叫 WinHttpAddRequestHeaders 在 pwszHeaders 參數 中指定 cookie 標頭。 用戶端應用程式應該先清除所有 Cookie 標頭,再重新傳送要求。

當要求重新導向時,用戶端應用程式也應該變更 Cookie 標頭。 若要在重新導向的要求上變更 Cookie,用戶端會指定回呼函式,其中包含 WinHttpSetStatusCallback,以回應重新導向回呼案例。 回呼處理程式應該呼叫 WinHttpAddRequestHeaders來清除先前在要求上傳送的 Cookie。 如需移除 Cookie 標頭的詳細資訊,請參閱 移除 Cookie 標頭

WinHTTP 用戶端應用程式可以結合 WinHTTP 自動 Cookie 處理機制與手動 Cookie 處理。 應用程式會先將自定義 Cookie 新增至自動產生的 Cookie 標頭,再使用 WinHttpSendRequest 函式傳送要求。 自訂 Cookie 應該是 WinHTTP API 要求中的第一個 Cookie 標頭,以便正確快取。 用戶端應用程式也應該先移除在先前的請求中傳送的Cookie,再重新在相同控制元上發送請求。 如需詳細資訊,請參閱移除 Cookie 標頭。

在呼叫 WinHttpSendRequest 之前新增到要求中的 Cookie,會包含在代表下一個 WinHttpSendRequestWinHttpReceiveResponse 所傳送的所有 WinHTTP 要求中。 當要求重新導向時,用戶端應用程式可能需要清除 Cookie 標頭。 若要清除重新導向要求上的 Cookie,用戶端會指定一個包含 WinHttpSetStatusCallback 的回呼函式,以處理重新導向的回呼案例。 回呼處理程式應該藉由呼叫 WinHttpAddRequestHeaders 來刪除先前在要求中傳送的 Cookie。 回呼函式可能不會在重新導向回呼上設定新的自定義 Cookie。 客戶端必須等候 WinHttpReceiveResponse 完成,才能為下一個 WinHttpSendRequest 呼叫新增 Cookie。

WinHTTP 用戶端應用程式可能需要先清除現有的要求 Cookie,再重新傳送要求,以防止先前要求上傳送的 Cookie 在目前要求上再次傳送;如需詳細資訊,請參閱下列附注。 也請注意,在请求处理程序上发送第一个请求之前,不需要清除 Cookie。 客戶端可以透過在 pwszHeaders 參數中設定空白的 Cookie 標頭,並在 dwModifier 參數中設置 WINHTTP_ADDREQ_FLAG_REPLACE 旗標,來呼叫 WinHttpAddRequestHeaders,達到清除現有 Cookie 的目的。 下列程式代碼範例示範如何清除要求的Cookie標頭。

WinHttpAddRequestHeaders(hRequest, 
                         L"Cookie:", 
                         -1, 
                         WINHTTP_ADDREQ_FLAG_REPLACE);

WinHTTP API 對於早於 Windows XP Service Pack 2 (SP2) 和 Windows Server 2003 Service Pack 1 (SP1) 的作系統版本有不同的 Cookie 處理行為。

**具有 SP2 和更新版本的 Windows XP,以及 SP1 和更新版本的 Windows Server 2003: **

WinHTTP API 會清除在先前的要求中針對請求控制代碼傳送的所有 Cookie。 用戶端可以在每次呼叫 WinHttpSendRequest 之前手動新增 Cookie 標頭。 如果 WinHTTP API 的自動 Cookie 處理功能尚未停用,WinHTTP API 將會將新的 Cookie 標頭(或在用戶端應用程式未手動新增時,新增一個新的 Cookie 標頭),並附上來自伺服器的 Cookie。

**具有 SP2 和 Windows Server 2003 SP1 的 Windows XP: **

WinHttpReceiveResponse 完成之後,WinHTTP API 不會清除要求 Cookie 標頭。 在先前要求中傳送的 Cookie 會在後續呼叫 WinHttpSendRequest 中重新傳送。 WinHTTP 用戶端應用程式應該先清除現有的 Cookie 標頭,再重新傳送要求句柄上的要求。