1. 程式人生 > >單點登入系列之——HTTP請求與Cookie講解

單點登入系列之——HTTP請求與Cookie講解



HTTPCookieSession

     HTTP協議作為無狀態協議,無狀態並不陌生,EJB bean中就有有狀態、無狀態之分,對於HTTP協議而言,無狀態同樣指每次request請求之前是相互獨立的,當前請求並不會記錄它的上一次請求資訊。那麼問題來了,既然無狀態,那完成一套完整的業務邏輯,傳送多次請求的情況數不勝數,使用http如何將上下文請求進行關聯呢?機智的人類通過優化,找到了一種簡單的方式記錄http協議的請求資訊

優化後的HTTP請求:

  1. 瀏覽器傳送request請求到伺服器,伺服器除了返回請求的response之外,還給請求分配一個唯一標識ID,協同response一併返回給瀏覽器。

  2. 同時伺服器在本地建立一個MAP結構,專門以key-value(請求ID-會話內容)形式將每個request進行儲存

  3. 此時瀏覽器的request已經被賦予了一個ID,第二次訪問時,伺服器先從request中查詢該ID,根據ID查詢維護會話的content內容,該內容中記錄了上一次request的資訊狀態。

  4. 根據查找出的request資訊生成基於這些資訊的response內容,再次返回給瀏覽器。如果有需要會再次更新會話內容,為下一次請求提供準備。

    所以根據這個會話ID,以建立多次請求-響應模式的關聯資料傳遞。說到這裡可能已經喚起了大家許多共鳴。這就是cookiesession對無狀態的

    http協議的強大作用。服務端生成這個全域性的唯一標識,傳遞給客戶端用於唯一標記這次請求,也就是cookie;而伺服器建立的那個map結構就是session所以cookies服務端生成,用於標記客戶端的唯一標識,無特定含義,在每次網路請求中,都會被傳送。session服務端自己維護的一個map資料結構,記錄key-content上下文內容狀態

Cookie7大屬性

Namevaluecookie最常用的兩個屬性,也是用於標識當前cookieid和對應內容的屬性。

Expires

用於設定cookie生命週期。

Path&domain

Pathdomain是針對於不同路徑、跨域請求中對

cookie進行設定的屬性。舉個簡單的例子,瀏覽器訪問百度的cookie一定不會發送給新浪網;訪問百度新聞時登入的資訊同樣可以用於百度網盤,雖然他們並非同一請求路徑下生成的cookie。這就是cookie的域和路徑的屬性。瀏覽器發出請求時,會根據cookiedomainpath屬性確定是否傳送cookie資訊。預設情況下,只會在同域同路徑下的cookie才會被傳輸。

httpOnly&secure

httpOnlysecure屬性是cookie用於設定協議的種類,如果設定了httpOnly則只有在http協議下對該cookie才可見。Securehttps時可見。這兩個屬性主要是為了對cookie資訊進行保護。

使用java語言操作cookie

//get cookie資訊
		Cookie[] cookies=req.getCookies();
		if(cookies!=null)
		{
			System.out.println(
					cookies[0].getName()+","
					+cookies[0].getMaxAge()+","
					+cookies[0].getDomain()+","
					+cookies[0].getPath()+","
					+cookies[0].getValue()+","
					+cookies[0].getSecure()+","
					+cookies[0].isHttpOnly());	
		}
		//寫入cookie	
		Cookie cookie=new Cookie("mycookieID", String.valueOf(System.currentTimeMillis()));
		cookie.setHttpOnly(true);
		cookie.setMaxAge(24*60*60);//24小時後過期 -以秒為單位的,基於當前時間的有效值
		cookie.setDomain("www.max.com"); //設定域名,表示該cookie僅對www.max.com是有效
		cookie.setPath("/");//設定路徑為根路徑,表示該cookie對根路勁下所有path有效
		//將cookie返回給瀏覽器
		resp.addCookie(cookie);
		
		//刪除cookie
		//cookie是沒有真正的刪除操作的,只能通郭cookie的有效時間,設定為負值即可。過去時間的cookie
		cookie.setMaxAge(-1);

使用cookie需注意

  1. cookie數量過多過大,浪費網路流量,因為每次請求都會帶著cookie,如果cookie過多或單個cookie攜帶資訊較大,都會造成網路資源浪費;

  2. Cookie不適用於對敏感重要資訊進行儲存,因為瀏覽器中通過除錯都可以看到該cookie具體資訊,且每次都會在客戶端快取,所以針對一些重要密碼等資訊不應使用cookie進行儲存.