1. 程式人生 > >**會話技術_Cookie& Session [web基礎day16] *

**會話技術_Cookie& Session [web基礎day16] *

今日內容

1.會話技術
	* Cookie
	* Session
2.JSP:入門學習

會話技術

1.會話:一次會話中包含多次請求和響應
	* 一次會話:瀏覽器第一次給伺服器資源傳送請求,會話建立,一直到某一端斷開連線,會話結束。
2.功能:共享資料(在一次會話的範圍內共享資料)
	 	 * 瀏覽器和伺服器是無狀態請求,就是說,每次的請求之間相互獨立,互不溝通。通過會話技術,可以讓伺服器和瀏覽器在多次請求間共享資料。
3.方式:會話技術:每次請求和響應之間本質是無法共享資料的,但是我們可以把請求響應的資料儲存在瀏覽器或者伺服器,相當於就可以間接的進行資料的交流。
	1.客戶端會話技術:Cookie
	2.伺服器端會話技術:Session

Cookie:將資料最終儲存在瀏覽器端的會話技術,可以讓多次請求之間實現資料的交流。

1.概念:客戶端會話技術,將資料儲存在客戶端。
2.快速入門:
	* 使用步驟:
		1.建立Cookie物件,繫結資料
			* new Cookie(String name,String value);
		2.傳送Cookie物件。
			* response.addCookie(Cookie cookie)
		3.獲取Cookie,拿到資料。
			* Cookie[] request.getCookies()
	-- 注意:只要是一次會話,Cookie會一直帶著。

3.原理:
	* 基於響應頭set-cookie和請求頭cookie實現
	
4.cookie實現的細節:
	1.一次可不可以傳送多個cookie?
		* 可以,可以建立多個cookie物件,使用response呼叫多次addCookie方法傳送cookie即可。
	2.cookie在瀏覽器中儲存多長時間?
		* 預設情況下,當瀏覽器關閉後,Cookie資料被銷燬
		* 持久化儲存:
			* setMaxAge(int seconds)  該方法引數有三種取值,如下:
				1.正數:將Cookie資料寫到硬碟的檔案中。持久化儲存。cookie存活時間,設定正數,單位是秒。
				2.負數:預設值		eg:cookie.setMaxAge(0);
				3.零:刪除cookie資訊
	3.cookie能不能存中文?
		* 在tomcat 8之前 ,cookie中不能直接儲存中文資料。
			* 需要將中文資料轉碼---一般採用URL編碼(%E3...)
		* 在tomcat 8之後,cookie支援中文資料。特殊字元還是不支援,建議採用URL編碼儲存,URL解析。
	4.cookie共享問題?
		1. 假設在一個tomcat伺服器中,部署了多個web專案,那麼在這些web專案中cookie能不能共享?
			* 預設情況下cookie不能共享。
			* setPath(String path):設定cookie的獲取的範圍。預設情況下,設定當前的虛擬目錄。
			* 如果要共享,則可以將path設定為"/"  eg:   c1.setPath("/")
		2.不同的tomcat伺服器間cookie共享問題。
			* setDomain(String path):如果設定一級域名相同,那麼多個伺服器之間cookie可以共享。
				* setDomain(".baidu.com"),那麼tieba.baidu.com和news.baidu.com中cookie可以共享。
5.Cookie的特點和作用:
	1.cookie儲存資料在客戶端瀏覽器。   不太安全:容易丟失和被篡改
	2.瀏覽器對於單個cookie的大小有限制(4kb),以及對同一個域名下的總cookie數量也有限制(20個),每個瀏覽器的個數和大小限制也有可能不一樣。
		* 作用:
			1.cookie一般用於儲存少量的,不太敏感的資料
			2.在不登入的情況下,完成伺服器對客戶端的身份識別。

	案例:記住上一次的訪問時間
		需求:
			1.訪問一個Servlet,如果是第一次訪問,則提示:您好,歡迎您首次訪問
			2.如果不是第一次訪問,則提示:歡迎回來,您上次訪問時間為:顯示時間字串。
注意:
	* 第一次訪問,沒有cookie資料,則為null,需要加一個非空判斷
	* 在Cookie中不能儲存空格等特殊字元,所以我們儲存的是時間毫秒值。
	* 當回顯給瀏覽器的時候,我們會將事件毫秒值轉換為一個特定改格式的日期字串。
	* 在登入案例的時候,判斷兩個是否相等應該判斷字串名稱是否相等。

JSP: 入門學習

1.概念:
	* Java Server Pages:java服務端頁面
		* 可以理解為:一個特殊的頁面
		* 用於簡化書寫!
	-- JSP:幫我們把JSP中的內容,轉換為Java程式碼,免去了我們自己用write("<html>...</html>")	.
2.原理:
	* JSP本質上就是一個Servlet
	* 伺服器會幫我們把JSP頁面轉換為一個Servlet,把JSP中的java程式碼,原樣展示。把JSP中的html標籤,會幫我們用out.write("標籤");
	* JSP頁面中:html中的內容    java程式碼
	1.伺服器解析請求訊息,找是否有index.jsp資源
	2.如果找到了,會將index.jsp轉換為.java檔案
	3.編譯.java檔案,生成.class位元組碼檔案
	4.由位元組碼檔案提供訪問

3.JSP的指令碼:JSP定義Java程式碼的方式。
	1.<% 程式碼 %>:定義的java程式碼,在service方法中。service中可以定義什麼,該指令碼中就可以定義什麼。
	2.<%! 程式碼 %>:定義的java程式碼,定義成員變數和成員方法
	3.<%= 程式碼 %>:定義的java程式碼,會輸出到液麵上。輸出語句是什麼
	(它是定義在service中,如果輸出區域性和成員變數同樣的變數的時候,輸出採用就近原則輸出區域性變數,它類似於System.out.print( 程式碼 ) 或 out.write( 程式碼 ) )
* 總之,帶!的定義在java類成員位置,帶=輸出,其他的都放在service中,我們儘量不要定義成員變數,在多執行緒中容易引發執行緒安全問題。

4.JSP的內建物件:
	* 在jsp頁面中不需要獲取和建立,可以直接使用的物件
	* jsp一共有9個內建物件
	* 今天學習3個:
		* request
		* response
		* out:字元輸出流物件。可以將資料輸出到頁面上。和response.getWriter()類似。
			* response.getwriter()和out.writer的區別:
				-- 在tmocat伺服器真正給客戶端做出響應之前,會先找response緩衝區資料,再找out緩衝區數區。所以response.getwriter永遠列印在out.writer前,out.writer列印會在什麼位置列印就會出現在什麼位置。所以建議使用out.writer列印。使用response會容易影響頁面佈局。

Session:主菜

1.概念:伺服器端會話技術,在一次會話的多次請求間共享資料,將資料儲存在伺服器端的物件中。HttpSession。
2.快速入門:
	1.獲取HttpSession物件:
		* HttpSession session=request.getSession
	2.使用HttpSession物件:
		* Object getAttribute()
		* void setAttribute()
		* void removeAttribute()
3.原理:
	* 舉一個例子:伺服器相當於銀行,而客戶端相當於客戶。銀行辦卡(request.getSession)充錢(setAttribute),然後把帶著卡號的卡給了客戶,錢儲存在了銀行。第二次客戶來銀行取錢。然後拿著卡號找自己對應的金額資訊,獲取到了金錢。過程依賴於Cookie
	
4.細節:
	1.當客戶端關閉後,伺服器不關閉,兩次獲取Session是否為同一個?
		* 預設情況下,不是。
		* 如果需要相同,則可以建立Cookie,鍵為JSESSIONID,值為id的值,設定最大存活時間,讓cookie持久化存活。
		* Cookie c=new Cookie("JsessionID","session.getId()")
		* c.setMaxAge(60*60);
		* response.addCookie(c);
	2.客戶端不關閉,伺服器關閉後,兩次獲取的Session是同一個嗎?	
		* 不是同一個:
		* 伺服器重新啟動後,建立的Session物件的記憶體地址不同,所以儲存的資料會丟失。
		* 可以使用session的鈍化和活化解決:
			* session的鈍化:在伺服器正常關閉之前,將sessiond物件序列化到硬碟上
			* session的活化:在伺服器啟動後,將session檔案轉化為記憶體中的session物件即可。
				
	3.session什麼時候被銷燬?
		1.伺服器被關閉
		2.session物件呼叫invalidate()
		3.session預設失效時間是30分鐘
			選擇性配置修改:
				<session-config>
					<session-timeout>30</session-timeout>
				</session-config>

5.session的特點:
	1.session用於儲存一次會話的多次請求的資料,存在伺服器端。
	2.session可以儲存任意型別,任意大小的資料。
	
	* session與Cookie的區別:
		1.session儲存資料在伺服器端,Cookie在客戶端
		2.session沒有資料大小限制,Cookie有
		3.session資料安全,Cookie相對不安全(因為Cookie儲存在客戶端,容易丟失和被篡改)

案例:驗證碼

1.案例需求:
	1.訪問帶有驗證碼的登入頁面login.jsp
	2.使用者輸入使用者名稱,密碼以及驗證碼。
		* 如果使用者名稱和密碼輸入有誤,跳轉登入頁面,提示:使用者名稱或密碼錯誤
		* 如果驗證碼輸入有誤,跳轉登入頁面,提示:驗證碼錯誤
		* 如果全部輸入正確,則跳轉到主頁success.jsp,顯示:使用者名稱,歡迎您。

Cookie案例_記住上次訪問時間

Cookie案例登入時間驗證

JSP截斷的程式碼演示

持久化儲存cookie時間的程式碼演示

JSP原理

登入案例

延長Session生命週期的程式碼演示,期望客戶端關閉後,session也能相同