天天看點

ASP.NET Cookie對象到底是毛啊?(簡單小例子)

記得剛接觸asp.net的時候,就被幾個概念搞的頭痛不已,比如Request,Response,Session和Cookie。然後還各種在搜尋引擎搜,各種問同僚的,但是結果就是自己還是很懵的節奏。

那cookie到底是毛啊?下面是我最不喜歡的一種解釋方式(官方定義吧應該叫,我這種智商根本讀不懂嘛~)

Cookie對象也稱緩存對象,該對象用于儲存用戶端浏覽器請求的伺服器頁面,也可用它存放非敏感性的使用者資訊。

以前根本讀不懂啊,現在其實也懵懵的。

還是用例子能把這個概念搞明白

1、做一個使用者登入的界面,用cookies儲存登入資訊的功能。如圖:

背景代碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<code>        </code><code>protected</code> <code>void</code> <code>Page_Load(</code><code>object</code> <code>sender, EventArgs e)</code>

<code>        </code><code>{</code>

<code>            </code><code>if</code> <code>(Request.Cookies[</code><code>"password"</code><code>] != </code><code>null</code><code>)</code>

<code>            </code><code>{</code>

<code>                </code><code>if</code> <code>(DateTime.Now.CompareTo(Request.Cookies[</code><code>"password"</code><code>].Expires) &gt; 0)</code>

<code>                </code><code>{</code>

<code>                    </code><code>textbox_password.Text = Request.Cookies[</code><code>"password"</code><code>].Value;</code>

<code>                </code><code>}</code>

<code>            </code><code>}</code>

<code>        </code><code>}</code>

<code>        </code><code>protected</code> <code>void</code> <code>button_login_Click(</code><code>object</code> <code>sender, EventArgs e)</code>

<code>            </code><code>if</code> <code>(checkbox_remember.Checked)</code>

<code>                </code><code>HttpCookie cookie_password = </code><code>new</code> <code>HttpCookie(</code><code>"password"</code><code>);</code>

<code>                </code><code>cookie_password.Value = textbox_password.Text;</code>

<code>                </code><code>Response.Cookies.Add(cookie_password);</code>

<code>                </code><code>DateTime dtNow = DateTime.Now;</code>

<code>                </code><code>TimeSpan ts = </code><code>new</code> <code>TimeSpan(0, 0, 0, 10);</code><code>//這裡是将cookie的有效期設定成10s</code>

<code>                </code><code>cookie_password.Expires = dtNow.Add(ts);</code>

<code>            </code><code>} </code>

這個例子很簡單,思路就是選擇記住密碼的checkbox,就建立一個cookie用于記錄密碼的内容,同時設定有效期。當下次加載的時候,判斷有沒有這個“密碼”cookie,有的話判斷這個cookie是否過期,若未過期,就将這個cookie裡存的值取出來,放到對應的文本框中。

這裡把有效期設定為10s的原因是為了讓大家看到的效果明顯些。大家隻要不斷的去重新整理頁面,就會發現在10s之前,密碼部分還是一直有值,過了10s,就自動清空了。這就是因為cookie到期。

2、一個統計目前IP登入頁面次數的功能。界面如圖:

其實還是這個例子比較有意思,界面很簡單,但是問題稍多。

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

<code>        </code><code>string</code> <code>ipAddress = </code><code>string</code><code>.Empty;</code>

<code>            </code><code>ipAddress = Dns.GetHostByName(Server.MachineName.ToString()).AddressList[0].ToString();</code>

<code>            </code><code>if</code> <code>(!IsPostBack)</code>

<code>                </code><code>if</code> <code>(Request.Cookies.AllKeys.Contains(ipAddress))</code>

<code>                    </code><code>//Request.Cookies[ipAddress].Value = (Convert.ToInt32(Request.Cookies[ipAddress].Value) + 1).ToString();@@@</code>

<code>                    </code><code>HttpCookie cookie_ip = </code><code>new</code> <code>HttpCookie(ipAddress);</code>

<code>                    </code><code>cookie_ip.Value = (Convert.ToInt32(Request.Cookies[ipAddress].Value) + 1).ToString();</code>

<code>                    </code><code>Response.Cookies.Set(cookie_ip);</code>

<code>                </code><code>else</code>

<code>                    </code><code>HttpCookie cookie_ip = </code><code>new</code> <code>HttpCookie(ipAddress);    </code>

<code>                    </code><code>cookie_ip.Value = </code><code>"1"</code><code>;</code>

<code>                    </code><code>Response.Cookies.Add(cookie_ip);</code>

<code>                    </code><code>DateTime dtNow = DateTime.Now;</code>

<code>                    </code><code>TimeSpan ts = </code><code>new</code> <code>TimeSpan(0, 0, 0, 20);</code>

<code>                    </code><code>cookie_ip.Expires = dtNow.Add(ts);</code>

<code>        </code><code>protected</code> <code>void</code> <code>button_statistics_Click(</code><code>object</code> <code>sender, EventArgs e)</code>

<code>            </code><code>if</code> <code>(Request.Cookies[ipAddress] != </code><code>null</code><code>)</code>

<code>                </code><code>textbox_count.Text = Request.Cookies[ipAddress].Value;</code>

<code>            </code><code>else</code>

<code>                </code><code>textbox_count.Text = </code><code>"0"</code><code>;</code>

<code>        </code><code>protected</code> <code>void</code> <code>button_clear_Click(</code><code>object</code> <code>sender, EventArgs e)</code>

<code>            </code><code>HttpCookie cookie_ip = </code><code>new</code> <code>HttpCookie(ipAddress);</code>

<code>            </code><code>cookie_ip.Expires = DateTime.Now.AddDays(-1);</code>

<code>            </code><code>Response.Cookies.Set(cookie_ip);</code>

<code>            </code><code>Request.Cookies.Remove(ipAddress);</code>

<code>            </code><code>Request.Cookies.Clear();</code>

這個小例子的思路就是,先獲得本地的IP位址,這就保證了添加Cookie的時候,給Cookie了一個獨一無二的key。在重新整理頁面的時候,去判斷目前所有Cookie中是否存在一個同名的cookie。如果不存在,就建立一個cookie,當然,此cookie的key=IP位址。就是Page_Load裡else的部分。如果存在,那麼就在原來的值的基礎上加1。這裡要注意修改已存在Cookie值的寫法。

最開始的時候我用的是注釋掉的@@@這行代碼,就是正常思路,看着也沒什麼問題呀,不過這樣寫不行,第一次加載之後的每次加載,取到的Request.Cookies[ipAddress].Value這個值總是1。是以對于修改已有的cookie值,還是需要使用cookies的set方法才行。

此外還有一個地方是需要注意的,就是删除cookie的時候,如果直接使用Cookies.Remove或者Cookies.Clear()方法都達不到想要的效果。需要配合的加上Expires,給一個負值。然後去更新Cookie,再删除,這樣這個cookie就徹底消失了。否則在下次加載的時候又會出現,這個還真不知道是為什麼?我之前就寫了一句Request.Cookies.Clear(),打斷點跟的時候,所有的cookie确實都清空了,但是當再次加載的時候,在添加cookie前打了斷點,會發現之前删除的cookie又出現了。很奇怪啊~~

希望明白的朋友告訴一聲怎麼回事哈。

兩個簡單的小例子讓自己對cookie不再感覺那麼陌生和害怕了。是以光看概念還是效果一般,動手才是王道呀~

本文轉自 我不會抽煙 51CTO部落格,原文連結:http://blog.51cto.com/zhouhongyu1989/1439810,如需轉載請自行聯系原作者

繼續閱讀