1. 程式人生 > >javaweb cookie介紹和使用

javaweb cookie介紹和使用

參考文件: 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小時