深入理解Session與Cookie
Session與Cookie的作用都是為了保持訪問用戶與后端服務(wù)器的交互狀態(tài)。它們有各自的有點(diǎn),也有各自的缺陷。Cookie會隨著個數(shù)的增多和訪問量的增加,它占用的網(wǎng)絡(luò)帶寬也很大,Session致命缺點(diǎn)在于多臺服務(wù)器之間的共享。
Cookie
| 屬性項(xiàng) | 屬性項(xiàng)介紹 |
|---|---|
| NAME-VALUE | 注意這里的NAME不能和其他屬性項(xiàng)的名字一樣 |
| Expires | 過期時間,在設(shè)置的某個時間點(diǎn)后該Cookie就會失效 |
| Domain | 生成該Cookie的域名 |
| Path | 該Cookie是在當(dāng)前哪個路勁下生成的 |
| Secure | 如果設(shè)置了這個屬性,那只會在SSH連接時才會回傳該Cookie |
當(dāng)前Cookie有兩個版本:Version 0 和Version 1,它們有兩種設(shè)置響應(yīng)頭的標(biāo)識,分別是“Set-Cookie”和“Set-Cookie2”。這兩個版本的屬性項(xiàng)有些不同。
Version 0 屬性項(xiàng)介紹
| 屬性項(xiàng) | 屬性項(xiàng)介紹 |
|---|---|
| NAME-VALUE | 注意這里的NAME不能和其他屬性項(xiàng)的名字一樣 |
| Expires | 過期時間,在設(shè)置的某個時間點(diǎn)后該Cookie就會失效 |
| Domain | 生成該Cookie的域名 |
| Path | 該Cookie是在當(dāng)前哪個路勁下生成的 |
| Secure | 如果設(shè)置了這個屬性,那只會在SSH連接時才會回傳該Cookie |
Version 1 與Version 0 中設(shè)置的Header頭的標(biāo)識符是不同的,我們常用的是Set-Cookie:userName="";Domain="",這是Version0的形式。針對Set-Cookie2是這樣設(shè)置的:Set-Cookie2:userName="";Domain="";Max-Age=1000。但是在Java Web的Servlet規(guī)范中并不支持Set-Cookie2響應(yīng)頭。
String getCookie(Cookie[] cookies, String key) {
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals(key)) {
return cookie.getValue();
}
}
}
return null;
}
public void doGet(HttpServletRequest request, HttpServletResponse response) {
Cookie[] cookies = request.getCookies();
String userName = getCookie(cookies, "userName");
String userAge = getCookie(cookies, "userAge");
if (userName == null) {
response.addCookie(new Cookie("userName", "zft"));
}
if (userAge == null) {
response.addCookie(new Cookie("userAge", "26"));
}
response.getHeader("Set-Cookie");
}