Cookie學習小結以及一個小案例(返回上次訪問的時間,如果是第一次,則返回你好)

0、什麼是Cookie?它有什麼用?

Cookie就是一個小型文本文件,裏面是一些信息片段,它可以以自動地在瀏覽器和Web服務器之間進行交互,因此Cookie可以存儲在多個頁面間傳遞的信息。通俗的講,你可以理解是在客戶端本地存儲的一些數據。Cookie作爲HTTP header的一部分,它的傳輸始終受HTTP協議控制。HTTP是一種無狀態協議,故Cookie也是無狀態的。
Cookie是由服務器創建的,但是它不會保存在服務器裏,創建好之後,發送給瀏覽器,瀏覽器保存在用戶本地,下一次訪問網站的時候,就會把該cookie發送給服務器。瀏覽器在訪問同一Web服務器的時候,會將之前收到的cookie一併發送。

1、怎麼用Cookie?

我們可以通過傳一個name和value給Cookie來創建一個Cookie對象:

Cookie cookie = new Cookie("name", "value");

這就創建了一個cookie對象,我們可以調用cookie的相關方法來進行一系列操作:

  • cookie.setMaxAge(int seconds); 這個方法用於設定cookie的生命週期,傳入的值爲秒。如果傳入的是正數,則表示在本地存儲一個cookie,並且它的週期是這個數字秒;如果爲負數,則表示爲默認週期(瀏覽器關閉,cookie被銷燬);如果是0,則一般用做刪除cookie。
  • cookie.setPath(String path); 這個方法用於設置cookie的路徑,一般在cookie共享的時候使用。cookie是不共享的,在tomcat裏部署多個web項目,cookie是不能共用的,不過你在這個setPath的方法中傳入的path爲"/",就可以實現多個是項目cookie共享。
  • cookie.setDomain(String path); 這個方法也是設置路徑,與上面不同的是,該方法是設置一級域名相同,這樣就可以實現多個服務器之間cookie共享。
  • response.addcookie(Cookie cookie); 用於添加一個cookie到服務器端,一旦執行,服務器端會發set-cookie響應頭到瀏覽器,set-cookie是自動帶鍵值對的,這樣使的cookie可以保存在瀏覽器上。
  • request.getCookie(); 對應上面的,用於獲取cookie

2.如何刪除cookie

並沒有直接的方法(類似於remove)去刪除一個cookie,我們可以創建一個同名的cookie,然後調用setMaxAge方法傳入參數爲0,並且添加到HttpServletResponse接口中:

Cookie cookie = new Cookie("name", "value");
cookie.setMaxAge(0);
response.addCookie(cookie);

3.Cookie的一些其他小知識

  1. Cookie存儲數據在客戶端瀏覽器是受限制的,瀏覽器對於單個Cookie的大小限制在4kb,對用一個域名下的總cookie數量也限制在20個。
  2. 在Cookie中一般存放少量不太敏感的數據,Cookie可以在不登錄的情況下,完成服務器最客戶端的身份識別。
  3. 一次可以發送多個Cookie對象,也就是多創建,使用response多次發送即可。

4.一個小實例

要求:如果我第一次訪問頁面,則它對我說“你好”,如果我後來訪問頁面,它就告訴我我上次訪問頁面的時間是什麼時候。
分析:我們可以把上次訪問時間的信息放在cookie裏面,給cookie設置一個很久的時間,這樣我們就可以實現要求了。當然我們也要做一個判斷是不是第一次訪問的工作。

package Download;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.crypto.Data;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CopyOnWriteArrayList;

@WebServlet("/CookieTestServlet")
public class CookieTestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //設置響應的消息的數據格式以及編碼
        response.setContentType("text/html;charset=utf-8");
        //1.獲取所有的Cookie,判斷名字是否非last
        Cookie[] cookies = request.getCookie();
        boolean flag = false;
        //2.遍歷cookie
        if(cookies != null && cookies.lenth > 0){
            for(Cookie cookie : cookies){
                if("lastTime".equals(cookie.getName())){
                    flag = true;
                    //有cookie不是第一次訪問
                    //設置cookie的value,獲取當前時間的字符串,重新設置cookie的值,重新發送
                   String value = request.getValue();
                   //將文件轉碼輸出
                   value = URLDecoder.decode(value, "utf-8");
                   response.getWirter().write("您上次訪問的時間是:" + value);
                   Date date = new Date();
                   //簡化年月日
                   SimpleDateDormat sdf = new SimpleDataDormat("yyyy年MM月dd日 HH:mm:ss");
                   String str_date = sdf.format(date);
                   //需要轉碼年月日,因爲cookie不識別一些特殊字符
                   str_date = URLEncoder.encode(str_date, "utf-8");
                   //將完整的時間寫進cookie
                   cookie.setValue(str_date);
                   cookie.setMaxAge(60 * 60 * 24 * 30);
                   response.addCookie(cookie);
                   break;
                }
            }
        }
        if(cookies == null || cookies.length == 0 || !flag){
            //沒有,表示第一次訪問
            Date date1 = new Date();
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String strdate = sdf1.format(date1);
            //編碼操作
            strdate = URLEncoder.encode(strdate, "utf-8");
            //將名字設置爲lastTime,標誌着下一次訪問就該是顯示上次訪問時間了。
            Cookie cookie = new Cookie("lastTime", strdate);
            //將第一次訪問的時間寫入cookie中
            response.addCookie(cookie);
            response.getWriter().write("您好");

        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

到此就告一段落了,看看運行結果吧:
我第一次訪問的時候是21點43分,然後大概44分多關的瀏覽器
在這裏插入圖片描述然後我再一次登上去:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章