WinHTTP 中的 Cookie 處理
HTTP 會話資料會在要求或回應的 Cookie 標頭中的用戶端與伺服器之間傳遞。 伺服器會將 Cookie 傳送至回應之 Set-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 處理
若要停用 Cookie 處理,WinHTTP 用戶端應用程式會呼叫 WinHttpSetOption 函式, 並將 dwOption 參數設定為 WINHTTP_OPTION_DISABLE_FEATURE,並將 lpBuffer 參數設定為 WINHTTP_DISABLE_COOKIES。 hInternet參數必須是要求控制碼。 在已傳送先前要求的要求控制碼上停用 Cookie 處理時,用戶端應該使用 WinHttpAddRequestHeaders 函式手動移除現有的要求 Cookie 標頭,然後再傳送下一個要求。 如需詳細資訊,請參閱 移除 Cookie 標頭。
注意
在停用自動模式之後,用戶端應用程式必須在會話上設定所有 Cookie。
手動指定所有 Cookie
停用自動 Cookie 處理時,WinHTTP 用戶端應用程式可以選擇手動指定所有 Cookie。 若要手動設定 Cookie,應用程式會呼叫 WinHttpAddRequestHeaders ,並在 pwszHeaders 參數中指定 Cookie 標頭。 用戶端應用程式應該先清除所有 Cookie 標頭,再重新傳送要求。
用戶端應用程式也應該在要求重新導向時變更 Cookie 標頭。 若要變更重新導向要求上的 Cookie,用戶端會使用 WinHttpSetStatusCallback 指定回呼函式,以回應重新導向回呼案例。 回呼處理常式應該藉由呼叫 WinHttpAddRequestHeaders來清除先前在要求上傳送的 Cookie。 如需移除 Cookie 標頭的詳細資訊,請參閱 移除 Cookie 標頭。
手動和自動 Cookie 處理
WinHTTP 用戶端應用程式可以結合 WinHTTP 自動 Cookie 處理機制與手動 Cookie 處理。 應用程式會在使用 WinHttpSendRequest 函式傳送要求之前,將自訂 Cookie 新增至自動產生的 Cookie 標頭。 自訂 Cookie 應該是 WinHTTP API 要求中的第一個 Cookie 標頭,才能正確快取 Cookie。 用戶端應用程式也應該移除先前要求所傳送的 Cookie,再重新傳送相同要求控制碼上的要求。 如需詳細資訊,請參閱移除 Cookie 標頭。
在呼叫 WinHttpSendRequest 之前新增至要求的 Cookie 會包含在代表下一個 WinHttpSendRequest 和 WinHttpReceiveResponse 呼叫傳送的所有 WinHTTP 要求中。 當要求重新導向時,用戶端應用程式可能需要清除 Cookie 標頭。 若要清除重新導向要求上的 Cookie,用戶端會使用 WinHttpSetStatusCallback 指定回呼函式,以回應重新導向回呼案例。 回呼處理常式應該藉由呼叫 WinHttpAddRequestHeaders來清除先前在要求上傳送的 Cookie。 回呼函式可能不會在重新導向回呼上設定新的自訂 Cookie。 用戶端必須等候 WinHttpReceiveResponse 完成,才能為下一個 WinHttpSendRequest 呼叫新增 Cookie。
移除 Cookie 標頭
WinHTTP 用戶端應用程式可能需要先清除現有的要求 Cookie,再重新傳送要求,以防止在先前要求上傳送的 Cookie 在目前要求上再次傳送;如需詳細資訊,請參閱下列附注。 也請注意,在要求控制碼上傳送第一個要求之前,不需要清除 Cookie。 用戶端可以呼叫 WinHttpAddRequestHeaders ,並在 pwszHeaders 參數中使用空的 Cookie 標頭,以及 dwModifier 參數中設定的 WINHTTP_ADDREQ_FLAG_REPLACE 旗標來清除現有的 Cookie。 下列程式碼範例示範如何清除要求的 Cookie 標頭。
WinHttpAddRequestHeaders(hRequest,
L"Cookie:",
-1,
WINHTTP_ADDREQ_FLAG_REPLACE);
WinHTTP API 與 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:**
WinHTTP API 不會在 WinHttpReceiveResponse 完成之後清除要求 Cookie 標頭。 在先前要求中傳送的 Cookie 會在 後續對 WinHttpSendRequest的呼叫中重新傳送。 WinHTTP 用戶端應用程式應該先清除現有的 Cookie 標頭,再重新傳送要求控制碼的要求。