1. 程式人生 > >Wininet、WebBrowser程式設計中如何管理Cookie

Wininet、WebBrowser程式設計中如何管理Cookie

用VC++訪問網頁,一般都是用微軟提供的Wininet、WinHTTP(基於HTTP協議)或WebBrowser(載入整個網頁)。當然還有libcurl之類的第三方類庫,因為暫時沒接觸過,就不說了。

在使用上述三種方式訪問網頁的程式設計過程中,預設情況下是由它來管理Cookie,但有時候程式設計師想手工干預,比如清除Cookie、修改Cookie、新增Cookie。在網上搜索了一下,大概有這麼三種方法:

一. FindFirstUrlCacheEntry FindNextUrlCacheEntry DeleteUrlCacheEntry 這些API屬於Wininet,可以清除持久的Cookie,不能清除會話級Cookie,因為會話級Cookie是在程序記憶體中,這些API是基於硬碟快取檔案的清理。
二. InternetGetCookie InternetSetCookie InternetGetCookieEx InternetSetCookieEx 這些API屬於Wininet,可以獲取、新增、覆蓋、修改、刪除持久Cookie和會話級Cookie(會話級Cookie需要在同進程中操作)。加Ex字尾的API可以對HTTPOnly的Cookie進行操作。 InternetSetCookie 該API可以新增會話級Cookie,也可以新增持久Cookie,新增持久的Cookie請在每條Cookie後加expires。比如: TestData = Test; expires = Sat,01-Jan-2000 00:00:00 GMT
使用該API也可以覆蓋、修改、刪除Cookie,但用的時候要十分注意!!! 設定的Cookie的歸屬URL和每個屬性都要和目標Cookie一一對應才能正確操作Cookie。特別是Path和Domain屬性,否則會導致添加了一個同名Cookie而不能覆蓋或清除目標Cookie的結果。先檢視Cookie是怎麼被設定的,在響應頭Set-Cookie中找到該Cookie是怎麼被設定的。比如響應頭是這樣的: Set-Cookie: uin=55555555; PATH=/; DOMAIN=qq.com; 那麼用此API修改此Cookie的時候一定不能忘了PATH和DOMAIN屬性。 如果要修改此Cookie:
InternetSetCookie("http://.qq.com/",NULL,"uin=22222222; PATH=/; DOMAIN=qq.com"); 也可以給此Cookie賦空值: InternetSetCookie("http://.qq.com/",NULL,"uin=; PATH=/; DOMAIN=qq.com"); 也可以刪除此Cookie: InternetSetCookie("http://.qq.com/",NULL,"uin=; PATH=/; DOMAIN=qq.com ;expires = Sat,01-Jan-2000 00:00:00 GMT"); 給其設定一個過期的時間便清除了Cookie,會話級Cookie也可被清除。如果給會話級Cookie設定一個沒有到期的時間,會話級Cookie將變成持久Cookie。 注意,每次只能操作一個Cookie。如果需要操作多個Cookie,需要呼叫多次該API。 InternetGetCookie 該API可以獲取持久的Cookie,如果在同進程中,還可以獲取會話級Cookie。如果要獲取HTTPOnly的Cookie,請使用InternetGetCookieEx。值得注意的是InternetGetCookie的第二個引數lpszCookieName無用,InternetGetCookieEx的第二個引數才啟用了。 三. IHTMLDocument2::get_cookie() IHTMLDocument2::put_cookie() 用MSHTML對Document物件的Cookie屬性進行操作。也可以實現類似InternetGetCookie和InternetSetCookie的效果。實際上它等同於用javascript來讀寫文件中的Cookie。它同樣可以獲取、新增、覆蓋、修改、刪除持久Cookie和會話級Cookie,但不可讀寫HTTPOnly的Cookie。這種方式同樣也要十分注意設定的Cookie的每個屬性都要和目標Cookie一一對應才能正確操作Cookie。特別是Path和Domain屬性,否則會導致添加了一個同名Cookie而不能覆蓋或清除目標Cookie的結果。 和上面的例子類似: 如果要修改Cookie: CComQIPtr<IHTMLDocument2> spDoc = GetHtmlDocument(); CComBSTR bstr = "uin=22222222; PATH=/; DOMAIN=qq.com;"; spDoc->put_cookie(bstr); 如果要刪除Cookie: CComQIPtr<IHTMLDocument2> spDoc = GetHtmlDocument(); CComBSTR bstr = "uin=; PATH=/; DOMAIN=qq.com; expires = Sat,01-Jan-2000 00:00:00 GMT"; spDoc->put_cookie(bstr);

總結下來,第一種方法基本很少用。二、三兩種方法較常用。

使用Wininet開發時,可以使用第二種方法。

使用WebBrowser開發時,可以使用二、三兩種方法。

相關推薦

WininetWebBrowser程式設計如何管理Cookie

用VC++訪問網頁,一般都是用微軟提供的Wininet、WinHTTP(基於HTTP協議)或WebBrowser(載入整個網頁)。當然還有libcurl之類的第三方類庫,因為暫時沒接觸過,就不說了。

處理器程序執行緒並行併發記憶體模型的相關概念併發程式設計的三個概念 Java記憶體模型剖析volatile關鍵字用volatile關鍵字的場景

處理器:即中央處理器(CPU,Central Processing Unit),它是一塊超大規模的積體電路,是一臺計算機的運算核心(Core)和控制核心( Control Unit)。它的功能主要是解釋計算機指令以及處理計算機軟體中的資料。 程序:程序(Process)是計算機中的程式關

1為什麼程式設計建議使用netty而不是用jdk nio?

如果對nio瞭解比較透徹的話,就不會糾結這個問題了,畢竟市面上流行的中介軟體,如mycat ,spark都是用的nio,當然使用netty的更多,如dubbo; 我們需要知道nio的原理,同時也不必亂造輪子。 使用jdk-nio你需要掌握linux-sele

使用 InternetGetCookieEx 獲取webbrowsercookie 包含 httponly

eterm har build last sta names int inter clas namespace AliLoginForm { public class MyIECookie { //[DllImport("wininet.

C語言儲存類別連結與記憶體管理

  第12章 儲存類別、連結和記憶體管理 通過記憶體管理系統指定變數的作用域和生命週期,實現對程式的控制。合理使用記憶體是程式設計的一個要點。 12.1 儲存類別 C提供了多種不同的模型和儲存類別,在記憶體中儲存資料。 被儲存的每一個值都佔用一定的實體記憶體;C語言把這樣一塊記憶體稱為物件

Jmeter使用Cookie管理器手動新增cookie

使用Cookie管理器,可以把伺服器返回的cookie資料自動記錄下來,下次使用jmeter傳送請求就會自動把cookie資訊帶上,以完成後續操作。但是有些cookie如果放在了介面的返回值裡,下次請求攜帶cookie時就需要自己手動新增cookie資訊到cookie管理器中,如圖。 1,登入成

【網路程式設計】TCP網路程式設計connect()listen()和accept()三者之間的關係

舉個簡單的例子(以下程式碼只是示範性的,用於說明不同套接字的作用,實際的函式會需要更多的引數): /* 建立用於監聽和接受客戶端連線請求的套接字 */ server_sock = socket(); /* 繫結監聽的IP地址和埠 */ bind(server_sock); /* 開始監聽 */ li

IM開發基礎知識補課(四):正確理解HTTP短連線CookieSession和Token

1、前言 眾所周之,IM是個典型的快速資料流交換系統,當今主流IM系統(尤其移動端IM)的資料流交換方式都是Http短連線+TCP或UDP長連線來實現。Http短連線主要用於從伺服器讀取各種持久化資訊:比如使用者資訊、聊天曆史記錄、好友列表等等,長連線則是用於實時的聊天訊息

Linux的使用者組和許可權管理

1、使用者和組的概念 Linux是多使用者多工(Multi-Users,Multi-tasks)的作業系統,對於每個使用者,使用使用者標識(ID)、密碼(Passwd)來唯一標識使用者。對於使用者的管理有3A認證:Authentication(認證)、Autho

JavaGUI簡介AWT概述以及佈局管理器(流式佈局管理邊界佈局管理網格佈局管理網格包佈局管理卡片佈局管理器)

1 GUI簡介   GUI的全稱是Graphical User Interface,即圖形使用者介面。顧名思義,就是應用程式提供給使用者操作的圖形介面,包括視窗、選單、按鈕、工具欄和其他各種使用者介面元素。Java中針對GUI設計提供了豐富的類庫,這些類分別位

淺談程式設計的執行緒程序分散式系統

單執行緒與多執行緒的比較:         單執行緒就是我們學習程式設計時最開始接觸的,比如寫一個"hello world"。而在多執行緒中,其共享code、data、files,同時,它們有各自的registers和stack。         簡單地說,多執

【Linux 網路程式設計】TCP網路程式設計connect()listen()和accept()三者之間的關係

基於 TCP 的網路程式設計開發分為伺服器端和客戶端兩部分,常見的核心步驟和流程如下: connect()函式:對於客戶端的 connect() 函式,該函式的功能為客戶端主動連線伺服器,建立連線是通過三次握手,而這個連接的過程是由核心完成,不是這個函式完成的,這個函式的作用僅僅是通知 Linux 核心

演算法=邏輯+控制: 在邏輯式程式設計,程式設計師只需表達邏輯,而控制交給程式語言的直譯器或編譯器去管理

“邏輯式語言著眼於關係而非函式,對付這類問題正是它的拿手好戲。”冒號聲音逐漸高亢,“大家應該都聽說過等式‘演算法+資料結構=程式’吧?這是Pascal設計者Niklaus Wirth的一本著作的書名,它刻畫了過程式尤其是結構化程式設計的思想。後來Robert Kowalski進一步提出:演算法=邏輯+控制。其

關於Socket程式設計的inet_ntopinet_pton和inet_ntoainet_addr

VS2013中除錯Socket程式碼時,遇到了點小問題: 問題程式碼為: inet_ntoa(addrClient.sin_addr);   生成錯誤訊息為: error C4996: 'inet_ntoa': Use inet_ntop() or InetNtop() instead or de

網路程式設計阻塞與非阻塞同步與非同步I/O模型的理解

1. 概念理解      在進行網路程式設計時,我們常常見到同步(Sync)/非同步(Async),阻塞(Block)/非阻塞(Unblock)四種呼叫方式:同步:所謂同步,就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事。 例如

Android網路程式設計關於AsyncHttpClient獲取cookie的問題

之前的專案登入模組存在問題,登入狀態和使用者名稱直接存在了SharedPreferences裡,進入軟體時直接判斷使用者名稱是否為空,為空時才進入登入頁面,否則直接讀取SP中的相關資料,看了AsyncHttpClient的文件後,才發現可以允許讀取cookie。

socket程式設計父子程序兄弟程序的埠問題

通過實驗顯示,還是埠A。為什麼?埠複用技術!那麼,實驗是怎麼做的呢?其實很簡單,server端啟動,在fork出子程序時保證每個子程序的連線保持(可以通過sleep讓其休息一會),此時,通過 “netstat -pan | grep A” 就可以看到有關埠A的一些資訊,可以發現有子程序通過A與對應的clien

20併發包的ConcurrentLinkedQueue和LinkedBlockingQueue有什麼區別?(高併發程式設計----6)

目錄 今天我要問你的問題是,併發包中的 ConcurrentLinkedQueue 和 LinkedBlockingQueue 有什麼區別? 典型回答 考點分析 知識擴充套件 執行緒安全佇列一覽 佇列使用場景與典型用例 前面介紹了各種佇列實現,在日常的應用開發中,如何進行

boa伺服器如何使用cgi管理cookie(c語言)

1 【方法1】 (1) 設定cookie printf( "Set-Cookie:username=%s; path=/; \r\n ",username); printf("Content-type: text/html\n\n"); 注意:設定cookie的語句要放在

Java複習-併發程式設計的三個問題:原子性可見性和有序性

在併發程式設計中,我們通常會遇到以下三個問題:原子性問題,可見性問題,有序性問題。 1、原子性: 原子性:即一個操作或者多個操作 要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行。 2、可