1. 程式人生 > >編寫一個簡單登錄驗證需要記錄日誌,Servlet中的Cookie

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

cookie java servlet j2ee javaweb


登錄驗證並記錄日誌

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

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

技術分享


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

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

技術分享

技術分享


CSS代碼:

技術分享

技術分享

技術分享

技術分享



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

技術分享

技術分享



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

技術分享

技術分享



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

技術分享

技術分享

技術分享



完成效果:

技術分享


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

技術分享


登錄失敗:

技術分享






Cookie

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

技術分享

而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信息,代碼示例:

技術分享

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


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

技術分享


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


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

技術分享


運行結果:

技術分享


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

技術分享

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


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

技術分享


訪問B Servlet,運行結果:

技術分享

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


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

技術分享


Servlet代碼示例:

技術分享


運行結果:

技術分享

技術分享


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

技術分享

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

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





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

有道雲筆記






本文出自 “zero” 博客,請務必保留此出處http://zero01.blog.51cto.com/12831981/1982195

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