|
InternetSetCookie 函數(shù)用來在程序中以可編程的方式為某個制定的URL或Domain設(shè)定Cookie內(nèi)容。該函數(shù)聲明如下: BOOL InternetSetCookie( lpszUrl 代表要設(shè)定Cookie的URL lpszCookieName 代表要設(shè)定的Cookie的名字,也就是Cookie鍵值對中的鍵名 lpszCookieData 代表要設(shè)定的Cookie的值,也就是Cookie鍵值對中的鍵值
首先,我自己在本機建立一個ASPX頁面,并在Page_Load()中加入讀取Cookie的代碼:
然后,我創(chuàng)建一個簡單工程調(diào)用InternetSetCookie方法,寫入Cookie。而后進行測試。測試發(fā)現(xiàn),如果給寫入的Cookie起了名字,那么服務(wù)端讀取Cookie就會成功。但是,如果按照MSDN的描述,將Cookie的名字置空。在WebBrowser客戶端可以讀取到Cookie。但是在服務(wù)端就沒辦法使用Request對象的Cookies索引器正確讀取Cookie,但可以使用Request.Headers["Cookie"] 方式讀取到這一匿名Cookie。主要原因是HttpRequest.Cookies 屬性是CookieCollection類型的,這個類型是NameObjectCollectionBase的派生類,而這個NameObjectCollectionBase類的基本實現(xiàn)是哈希表。 如果存入沒有名字的值,那么這個值當(dāng)然也無法通過哈希檢索到,所以就讀取不到了。
其實,上面說的還不是重點。我重點想做是,在某個WebBrowser中,截獲用戶點擊的鏈接,把WebBrowser已經(jīng)登陸后獲得的Cookie寫入新打開的IE中,以便實現(xiàn)SSO的功能。截獲新建IE窗體事件,可以通過DWebBrowserEvent2的NewWindow3事件來實現(xiàn),這個比較簡單。麻煩的就是怎么把Cookie寫入新打開的IE。我曾經(jīng)期望InternetSetCookie來實現(xiàn)此功能。但MSDN告訴我們,InternetSetCookie設(shè)定的Cookie只在本進程內(nèi)有效,無法跨進程訪問。新建的IE當(dāng)然屬于新的進程,所以即使調(diào)用了InternetSetCookie設(shè)定了Cookie,新的IE也無法將Cookie內(nèi)容提交到服務(wù)器端。
最后使用的辦法是,在服務(wù)器端做一個ASPX頁面A,當(dāng)需要SSO訪問某個頁面時,先訪問頁面A。由頁面A將Cookie寫入,然后Redirect到制定的頁面。 |
|
|