javaweb cookie介紹和使用
阿新 • • 發佈:2018-11-30
參考文件: https://www.cnblogs.com/xdp-gacl/p/3803033.html
一、會話的概念
會話可簡單理解為:使用者開一個瀏覽器,點選多個超連結,訪問伺服器多個web資源,然後關閉瀏覽器,整個過程稱之為一個會話。
有狀態會話:一個同學來過教室,下次再來教室,我們會知道這個同學曾經來過,這稱之為有狀態會話。
二、cookie的作用
我們在瀏覽器中,經常涉及到資料的交換,比如你登入郵箱,登入一個頁面。我們經常會在此時設定30天內記住我,或者自動登入選項。那麼它們是怎麼記錄資訊的呢,答案就是今天的主角cookie了,Cookie是由HTTP伺服器設定的,儲存在瀏覽器中,但HTTP協議是一種無狀態協議,在資料交換完畢後,伺服器端和客戶端的連結就會關閉,每次交換資料都需要建立新的連結。就像我們去超市買東西,沒有積分卡的情況下,我們買完東西之後,超市沒有我們的任何消費資訊,但我們辦了積分卡之後,超市就有了我們的消費資訊。cookie就像是積分卡,可以儲存積分,商品就是我們的資訊,超市的系統就像伺服器後臺,http協議就是交易的過程。
三、和session機制的區別
機制的區別:
session機制採用的是在伺服器端保持狀態的方案,而cookie機制則是在客戶端保持狀態的方案,cookie又叫會話跟蹤機制。開啟一次瀏覽器到關閉瀏覽器算是一次會話。說到這裡,講下HTTP協議,前面提到,HTTP協議是一種無狀態協議,在資料交換完畢後,伺服器端和客戶端的連結就會關閉,每次交換資料都需要建立新的連結。此時,伺服器無法從連結上跟蹤會話。cookie可以跟蹤會話,彌補HTTP無狀態協議的不足。
三、cookie工具類
/**
* Cookie 輔助類
*/
public class CookieUtils {
/**
* 每頁條數cookie名稱
*/
public static final String COOKIE_PAGE_SIZE = "_cookie_page_size";
/**
* 預設每頁條數
*/
public static final int DEFAULT_SIZE = 20;
/**
* 最大每頁條數
*/
public static final int MAX_SIZE = 200;
/**
* 獲得cookie的每頁條數 使用_cookie_page_size作為cookie name
*
* @param request
* @return default:20 max:200
*/
public static int getPageSize(HttpServletRequest request) {
Assert.notNull(request);
Cookie cookie = getCookie(request, COOKIE_PAGE_SIZE);
int count = 0;
if (cookie != null) {
if (NumberUtils.isDigits(cookie.getValue())) {
count = Integer.parseInt(cookie.getValue());
}
}
if (count <= 0) {
count = DEFAULT_SIZE;
} else if (count > MAX_SIZE) {
count = MAX_SIZE;
}
return count;
}
/**
* 獲得cookie
*
* @param request
* @param name
* cookie name
* @return if exist return cookie, else return null.
*/
public static Cookie getCookie(HttpServletRequest request, String name) {
Assert.notNull(request);
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie c : cookies) {
if (c.getName().equals(name)) {
return c;
}
}
}
return null;
}
/**
* 根據部署路徑,將cookie儲存在根目錄。
*
* @param request
* @param response
* @param name
* @param value
* @param expiry
* @param domain
* @return
*/
public static Cookie addCookie(HttpServletRequest request, HttpServletResponse response, String name, String value,
Integer expiry, String domain) {
Cookie cookie = new Cookie(name, value);
if (expiry != null) {
cookie.setMaxAge(expiry);
}
if (StringUtils.isNotBlank(domain)) {
cookie.setDomain(domain);
}
String ctx = request.getContextPath();
cookie.setPath(StringUtils.isBlank(ctx) ? "/" : ctx);
response.addCookie(cookie);
return cookie;
}
/**
* 取消cookie
*
* @param request
* @param response
* @param name
* @param domain
*/
public static void cancleCookie(HttpServletRequest request, HttpServletResponse response, String name,
String domain) {
Cookie cookie = new Cookie(name, "");
cookie.setMaxAge(0); //設定maxage為0表示去清除
String ctx = request.getContextPath();
cookie.setPath(StringUtils.isBlank(ctx) ? "/" : ctx);
if (StringUtils.isNotBlank(domain)) {
cookie.setDomain(domain);
}
response.addCookie(cookie);
}
}
3.1 cookie的過期形式
cookie過期時間設定方式:
cookie.setMaxAge(0);//不記錄cookie
cookie.setMaxAge(-1);//會話級cookie,關閉瀏覽器失效
cookie.setMaxAge(60*60);//過期時間為1小時