爲什麼要有cookie
瀏覽器和客戶端之間通信,少不了HTTP,但是HTTP是無協議的,服務器不知道上一次瀏覽器做了些什麼操作,於是誕生了cookie
什麼是cookie
cookie是一個存儲在瀏覽器的文本文件,存儲着用戶信息,cookie也稱爲瀏覽器會話技術。
每個請求添加Cookie HTTP請求頭髮送回服務器
組成
Cookie是一段不超過4KB的小型文本數據,由一個名稱(Name)、一個值(Value)和其它幾個用於控制Cookie有效期、安全性、使用範圍的可選屬性組成.
- Name/Value:設置Cookie的名稱及相對應的值。
- Expires屬性:設置Cookie的生存期。有兩種存儲類型的Cookie:會話性與持久性。Expires屬性缺省時,爲會話性Cookie,僅保存在客戶端內存中,並在用戶關閉瀏覽器時失效;持久性Cookie會保存在用戶的硬盤中,直至生存期到或用戶直接在網頁中單擊“註銷”等按鈕結束會話時纔會失效
- Path屬性:定義了Web站點上可以訪問該Cookie的目錄
- Domain屬性:指定了可以訪問該 Cookie 的 Web 站點或域,Cookie 機制並未遵循嚴格的同源策略,允許一個子域可以設置或獲取其父域的 Cookie。
- Secure屬性:指定是否使用HTTPS安全協議發送Cookie
- HTTPOnly 屬性:如果爲true,那麼通過js腳本將無法讀取到cookie信息。
cookie機制
- 用戶第一次訪問訪問網站時,發出一個http請求
- 服務器發送一個HttpResponse響應到客戶端,其中包含Set-Cookie的頭部
- 瀏覽器保持cookie,第二次請求Http請求中會包含一個Cookie的頭部
- 服務器響應,返回數據
添加cookie
/**
* 設置cookie
*
* @param response
* @param name cookie名字
* @param value cookie值
* @param maxAge cookie生命週期 以秒爲單位
*/
public static void addCookie(HttpServletResponse response,String domain,String path, String name,
String value, int maxAge,boolean httpOnly) {
Cookie cookie = new Cookie(name, value);
cookie.setDomain(domain);
cookie.setPath(path);
cookie.setMaxAge(maxAge);
cookie.setHttpOnly(httpOnly);
response.addCookie(cookie);
}
獲取cookie
/**
* 根據cookie名稱讀取cookie
* @param request
* @param cookieName1,cookieName2
* @return map<cookieName,cookieValue>
*/
public static Map<String,String> readCookie(HttpServletRequest request,String ... cookieNames) {
Map<String,String> cookieMap = new HashMap<String,String>();
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
String cookieName = cookie.getName();
String cookieValue = cookie.getValue();
for(int i=0;i<cookieNames.length;i++){
if(cookieNames[i].equals(cookieName)){
cookieMap.put(cookieName,cookieValue);
}
}
}
}
return cookieMap;
}
刪除cookie
if (null != cookie) {
cookie.setMaxAge(0);
}