內部;而瀏覽器一旦保存了cookie,之後瀏覽器每次訪問服務器時,都會通
過cookie請求頭,將cookie信息再帶回服務器中。在須要時,在服務器端能夠獲取請求中的cookie中的數據,從而實現某些功能。
web
一、建立Cookie對象後端
Cookie c = new Cookie(String name, String value); // 建立cookie的同時須要指定cookie的名字和cookie要保存的值 // Cookie的名字一旦指定後,就沒法修改!
二、將Cookie添加到response響應中跨域
response.addCookie( Cookie c ); // 將cookie添加到響應中,由服務器負責將cookie信息發送給瀏覽器,再由瀏覽器保 存到內部(能夠屢次調用該方法,添加一個以上的cookie)
三、獲取請求中的全部cookie對象組成的數組數組
Cookie[] cs = request.getCookies(); // 獲取請求中攜帶的全部cookie組成的cookie對象數組,若是請求中沒有攜帶任何 cookie,調用該方法會返回null。
四、刪除瀏覽器中的Cookie瀏覽器
代碼示例:安全
//建立一個名稱爲cart的cookie Cookie c = new Cookie("cart", ""); //設置cookie的最大生存時間爲零 c.setMaxAge( 0 ); //將cookie添加到響應中,發送給瀏覽器 response.addCookie( c ); out.write( "成功刪除了名稱爲cart的cookie..." );
五、Cookie的經常使用方法服務器
cookie.getName(); // 獲取cookie的名字 cookie.getValue(); // 獲取cookie中保存的值 cookie.setValue(); // 設置/修改cookie中保存的值(沒有setName方法,由於cookie的名字沒法修改) cookie.setMaxAge(); //設置cookie的最大生存時間(若是不設置,cookie默認在一次會話結束時銷燬!)
六、setMaxAge方法:設置cookie的最大生存時間cookie
代碼示例:網絡
//建立一個Cookie對象,將商品信息保存到cookie中 Cookie cookie = new Cookie( "cart", prod ); //設置cookie的最大生存時間, 單位:秒 cookie.setMaxAge( 60*60*24 ); //將cookie對象添加到response響應中 response.addCookie( cookie );
不少網站都會使用Cookie。例如,Google會向客戶端頒發Cookie,Baidu也會向客戶端頒發Cookie。那瀏覽器訪問Google會不會也攜帶上Baidu頒發的Cookie呢?或者Google能不能修改Baidu頒發的Cookie呢?
答案是否認的。Cookie具備不可跨域名性。根據Cookie規範,瀏覽器訪問Google只會攜帶Google的Cookie,而不會攜帶Baidu的Cookie。Google也只能操做Google的Cookie,而不能操做Baidu的Cookie。session
Cookie的maxAge決定着Cookie的有效期,單位爲秒(Second)。Cookie中經過getMaxAge()方法與setMaxAge(int maxAge)方法來讀寫maxAge屬性。
若是maxAge屬性爲正數,則表示該Cookie會在maxAge秒以後自動失效。瀏覽器會將maxAge爲正數的Cookie持久化,即寫到對應的Cookie文件中。不管客戶關閉了瀏覽器仍是電腦,只要還在maxAge秒以前,登陸網站時該Cookie仍然有效。下面代碼中的Cookie信息將永遠有效。
HTTP協議不只是無狀態的,並且是不安全的。使用HTTP協議的數據不通過任何加密就直接在網絡上傳播,有被截獲的可能。使用HTTP協議傳輸很機密的內容是一種隱患。若是不但願Cookie在HTTP等非安全協議中傳輸,能夠設置Cookie的secure屬性爲true。瀏覽器只會在HTTPS和SSL等安全協議中傳輸此類Cookie。
獲取session對象:
request.getSession() // 獲取一個session對象;若是在服務器內部有當前瀏覽器對應的session,則直接返回該session對象;若是沒有對應session,則會建立一個新的session對象再返回;
Session是一個域對象,session中也保存了一個map集合,而且session中也提供了存取數據的方法,以下:
session.setAttribute(String attrName, Object attrValue); // 往session域中添加一個域屬性,屬性名只能是字符串類型,屬性值能夠是任意類型。 session.getAttribute(String attrName); // 根據屬性名獲取域中的屬性值,返回值是一個Object類型
第一次調用request.getSession()方法時,會建立一個session對象。(當瀏覽器在服務器端沒有對應的session時,調用request.getSession()方法服務器會建立一個session象。)
當服務器正常關閉,在關閉以前,服務器會將內部的session對象序列化保存到服務器的work目錄下,變爲一個文件。這個過程叫作session的鈍化(序列化);再次將服務器啓動起來,鈍化着的session會再次回到服務器,變爲服務器中的對象,這個過程叫作session的活化(反序列化)。
在一次會話範圍內(獲取到的都是同一個session對象)
在整個會話範圍內實現數據的共享
Cookie和session都屬於會話技術,均可以保存會話中產生的數據,但因爲cookie和session的工做原理和特色不一樣,所以二者的應用場景也不同。
因爲會有愈來愈多的用戶訪問服務器,所以Session也會愈來愈多。爲防止內存溢出,服務器會把長時間內沒有活躍的Session從內存刪除。這個時間就是Session的超時時間。若是超過了超時時間沒訪問過服務器,Session就自動失效了。
Session的超時時間爲maxInactiveInterval屬性,能夠經過對應的getMaxInactiveInterval()獲取,經過setMaxInactiveInterval(longinterval)修改。
Session的超時時間也能夠在web.xml中修改。另外,經過調用Session的invalidate()方法可使Session失效。