編寫一個簡單登錄驗證需要記錄日誌,Servlet中的Cookie


登錄驗證並記錄日誌

之前介紹瞭如何使用Server、mysql、tomcat等知識點編寫了一個簡單的登錄驗證。但是現在有了一個新的需求,我想要在登錄成功的時候往數據庫記錄一條日誌,登錄失敗的時候也要記錄一下。這個日誌要記錄用戶名、用戶的IP地址、登錄的時間、還有成功或失敗的狀態標識。

所以現在需要增加一個表格,用於存儲日誌信息,如圖:

4791


因爲大部分思路和之前的寫登錄驗證差不多,只是多了個記錄日誌,所以我這裏就不贅述實現的思路了,直接上代碼。

1. 首先需要使用html編寫出頁面,代碼示例:

4792

4793


CSS代碼:

4794

4795

4796

4797



2. 同樣的需要編寫一個管理數據庫池的類:

4798

4799



3. 接收並處理響應用戶的請求的Servlet類:

4800

4802



4. 最後是完成與數據庫交互工作的類:

4803

4804

4805



完成效果:

4806


登錄成功,跳轉到目標頁面:

4807


登錄失敗:

4808






Cookie

在介紹cookie之前先談一談http協議,http協議是一種無狀態的協議,用戶的訪問請求一去一回就結束了,用戶的第二次請求就是一個全新的請求,並不會記錄用戶的上一次是否有進行過請求。服務端會認爲每一次的請求都是與上一次請求無關的,即便ip地址和訪問目標、請求方式一致也是如此,所以http是無狀態的:

4809

而cookie技術,就是用來解決http的無狀態特性所造成的問題的。



Cookie簡介:

Cookie(複數形態Cookies),中文名稱爲“小型文本文件”或“小甜餅”,指某些網站爲了辨別用戶身份而儲存在用戶本地終端(Client Side)上的數據(通常經過加密)。定義於RFC2109,是網景公司的前僱員盧·蒙特利在1993年3月的發明。

目前定義於 RFC2109 和 2965 中的都已廢棄,最新取代的規範是 RFC6265(可以叫做瀏覽器緩存)。


分類:

Cookie總是保存在客戶端中,按在客戶端中的存儲位置,可分爲內存Cookie和硬盤Cookie。

內存Cookie由瀏覽器維護,保存在內存中,瀏覽器關閉後就消失了,其存在時間是短暫的。硬盤Cookie保存在硬盤裏,有一個過期時間,除非用戶手工清理或到了過期時間,硬盤Cookie不會被刪除,其存在時間是長期的。所以,按存在時間,可分爲非持久Cookie和持久Cookie



用途:

一開始也說了,因爲HTTP協議是無狀態的,即服務器不知道用戶上一次做了什麼,這嚴重阻礙了交互式Web應用程序的實現。在典型的網上購物場景中,用戶瀏覽了幾個頁面,買了一盒餅乾和兩瓶飲料。最後結帳時,由於HTTP的無狀態性,不通過額外的手段,服務器並不知道用戶到底買了什麼。 所以Cookie就是用來繞開HTTP的無狀態性的“額外手段”之一。服務器可以設置或讀取Cookies中包含信息,藉此維護用戶跟服務器會話中的狀態。

在剛纔的購物場景中,當用戶選購了第一項商品,服務器在向用戶發送網頁的同時,還發送了一段Cookie,記錄着那項商品的信息。當用戶訪問另一個頁面,瀏覽器會把Cookie發送給服務器,於是服務器知道他之前選購了什麼。用戶繼續選購飲料,服務器就在原來那段Cookie裏追加新的商品信息。結帳時,服務器讀取發送來的Cookie就行了。

Cookie另一個典型的應用是當登錄一個網站時,網站往往會請求用戶輸入用戶名和密碼,並且用戶可以勾選“下次自動登錄”。如果勾選了,那麼下次訪問同一網站時,用戶會發現沒輸入用戶名和密碼就已經登錄了。這正是因爲前一次登錄時,服務器發送了包含登錄憑據(用戶名加密碼的某種加密形式)的Cookie到用戶的硬盤上。第二次登錄時,(如果該Cookie尚未到期)瀏覽器會發送該Cookie,服務器驗證憑據,於是不必輸入用戶名和密碼就讓用戶登錄了。

(以上內容轉自維基百科)



Cookie的缺陷:

雖然cookie能解決http的無狀態特性所造成的問題,但是它也並非是完美的,它的主要缺陷有以下幾項:

1. Cookie會被附加在每個HTTP請求中,所以無形中增加了流量。

2. 由於在HTTP請求中的Cookie是明文傳遞的,所以安全性成問題。(除非用HTTPS)

3. Cookie的大小限制在4KB左右。對於複雜的存儲需求來說是不夠用的。



以上介紹cookie是啥玩意,也說明了cookie用途和它的一些缺陷,那麼下面就演示如何在Servlet中使用cookie。


首先要介紹一下使用什麼方法來獲得和發送cookie:

  1. 想給瀏覽器一個Cookie信息,需要使用Response對象調用addCookie方法。

2. 想得到瀏覽器發送過來的Cookie, 則需要使用Request對象調用getCookies對方法。


Cookie的數據結構:

Cookie是以鍵/值對的方式存儲數據的,就像數據庫中的表格數據結構類似,而且在瀏覽器的控制檯中顯示的方式,也是以一個數據庫表格的方式呈現。如果出現了重複的cookie數據,那麼舊的數據會被新的數據所覆蓋掉。


下面使用一個簡單示例演示如何給瀏覽器響應cookie信息,代碼示例:

4810

這個Cookie過期時間的單位是秒,只要設置了過期時間就屬於持久存儲一類,因爲哪怕只有一秒也會被寫入到磁盤中。


使用瀏覽器訪問這個Servlet後,打開控制檯查看Cookie信息:

4811


如圖,可以看到服務器將cookie數據響應到瀏覽器中了,顯示的方式和表格類似。


如果不設置cookie過期時間的話,那麼瀏覽器關閉,cookie就會被清空,示例:

4812


運行結果:

4813


關閉瀏覽器再次打開這個控制檯:

4814

可以看到,我們的cookie數據不存在了,這種就是非持久存儲的cookie。


然後下來就是如何獲得瀏覽器請求帶過來的cookie數據,前提是你的瀏覽器要有這個cookie,所以得先訪問A Servlet再訪問B Servlet:

4815


訪問B Servlet,運行結果:

4816

如圖,可以看到將瀏覽器中所有的cookie數據都獲得到手了。


最後我們使用以上所介紹的cookie知識點來做一個簡單的登錄,登錄後能記錄用戶的登錄信息,即便用戶使用登錄後的網址訪問也仍是登錄狀態,html代碼示例:

4817


Servlet代碼示例:

4818


運行結果:

4819

4820


現在登錄了之後就能夠不用再次登錄了,直接訪問login就能顯示歡迎登錄:

4821

如圖,我是直接訪問的login,並沒有進行登錄,依然會顯示歡迎登錄,因爲通過了cookie讓服務端記憶了我的登錄狀態。

以上這僅是一個簡單的cookie在登錄中的應用示例,實際的情況上要比這複雜得多,還需要加密啥的。





如果圖片失效了可以點擊以下有道雲連接查看:

有道雲筆記






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章