HTTP是無狀態(tài)協(xié)議屯仗,它本身不能以狀態(tài)來區(qū)分和管理請(qǐng)求和響應(yīng)鱼填。當(dāng)服務(wù)端需要記錄用戶的狀態(tài)時(shí)侧戴,就需要某種機(jī)制來記錄和識(shí)別。
會(huì)話(Session) 跟蹤就是Web程序中常用的技術(shù)喷市,用來跟蹤用戶的整個(gè)會(huì)話相种。常用的會(huì)話跟蹤技術(shù)是Cookie與Session威恼,本篇介紹Cookie品姓。
Cookie
Cookie技術(shù)是客戶端的解決方案寝并。
Cookie通常以文本的方式記錄服務(wù)端發(fā)來的特殊信息,并在之后的請(qǐng)求中帶上Cookie以便讓服務(wù)端確認(rèn)腹备,大致流程如下:
┌─────────────┐ 1. Request ┌───────────────┐
│ │ ───────────────────────> │ │
│ │ 2. Response Set-Cookie │ │
│ │ <─────────────────────── │ │
│ Web Client │ │ Web Server │
│ │ 3. Request + Cookie │ │
│ │ ───────────────────────> │ │
│ │ 4. Response │ │
│ │ <─────────────────────── │ │
└─────────────┘ └───────────────┘
Set-Cookie
當(dāng)服務(wù)端準(zhǔn)備開始管理客戶端狀態(tài)時(shí)衬潦,會(huì)通過Set-Cookie來通知客戶端建立Cookie,并要求在后續(xù)的請(qǐng)求中將此Cookie發(fā)送回服務(wù)端植酥,直到Cookie過期镀岛。
Set-Cookie有幾個(gè)主要的屬性:
屬性 | 說明 |
---|---|
Name=Value | Cookie信息鍵值對(duì) - 必需項(xiàng) |
Expires=<date> | Cookie過期時(shí)間戳 |
Max-Age=<number> | Cookie有效時(shí)間(秒) |
Domain=<domain-value> | Cookie限制發(fā)送范圍的文件目錄 |
Path=<path-value> | Cookie適用對(duì)象的域名 |
Secure | Cookie是否只適用與Https |
HttpOnly | Cookie無法使用JavaScript獲得,防止跨站腳本攻擊(XSS) |
服務(wù)端操作Cookie(Java)
添加Cookie
Cookie cookie = new Cookie("username","lili"); // 新建Cookie
cookie.setDomain(".example.com"); // 設(shè)置域名
cookie.setPath("/"); // 設(shè)置路徑
cookie.setMaxAge(Integer.MAX_VALUE); // 設(shè)置有效期
response.addCookie(cookie); // 輸出到客戶端
獲取Cookie
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies){
// cookie.getName();
// cookie.getValue();
}
客戶端操作Cookie(JavaScript)
獲得Cookie的值
function getCookie(cname) {
var name = cname + "=";
var decodedCookie = decodeURIComponent(document.cookie);
var ca = decodedCookie.split(';');
for(var i = 0; i <ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
設(shè)置Cookie值
function setCookie(cname, cvalue, exdays) {
var d = new Date();
d.setTime(d.getTime() + (exdays*24*60*60*1000));
var expires = "expires="+ d.toUTCString();
document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}
刪除Cookie
function delCookie(name) {
var cval=getCookie(name);
if(cval!=null) {
setCookie(name, cval, -1);
}
}
參考
本文完