Cookie案例--上次訪問時間

Cookie案例 – 記住上次訪問時間

案例需求

  1. 訪問一個服務資源Servlet,若果是第一次訪問,則提示:您好,歡迎您首次訪問!
  2. 若不是第一次訪問,則提示:歡迎回來,您上次訪問時間爲:顯示時間字符串

案例分析

  1. 假設tomcat部署在服務器後不再關閉,則當瀏覽器未關閉時,可以採用cookie會話來實現;若瀏覽器關閉,也可以設定
    setMaxAge(int expiry)方法來設置Cookie存儲的時間
  2. 在服務資源Servlet中創建一個lastTime的Cookie對象;當客戶端訪問該資源時,通過查詢該Cookie對象是否存在即可知是否第一次訪問
    1. 若沒有lastTime的Cookie對象,則是第一次訪問
      *響應數據:您好,歡迎您首次訪問!
      *創建名爲lastTime的Cookie,並寫入數據:lastTime=“當前訪問時間”
    2. 若有lastTime的Cookie對象,則不是第一次訪問
      *響應數據:歡迎回來,您上次訪問時間爲:lastTime記錄的值
      *重新寫入lastTime的Cookie:lastTime=“當前訪問時間”

案例要點

  1. 響應編碼格式:由於需要給客戶端響應數據,且包含中文,所以需要設置響應頭,告知客戶端編碼格式
    *response.setContentType(“text/html;charset=utf-8”);

  2. 獲取登陸時間:新建一個Date對象獲取時間,然後新建一個SimpleDateFormat對象,設置時間格式,最後調用
    SimpleDateFormat對象的format方法,爲獲取的時間設置格式
    *Date date = new Date();
    *SimpleDateFormat sdf = new SimpleDateFormat(“yyyy年MM月dd日 HH:mm:ss”);
    *String str_date = sdf.format(date);

  3. 空格不兼容問題:由於設置的時間格式中存在中文空格,導致tomcat服務器不能正確識別,所以需要對字符進行URL編碼與解碼;
    即在往cookie中添加值之前進行URL編碼,從cookie中取值之後,進行URL解碼
    *// 加入cookie前,對時間進行URL編碼
    *String encode_date = URLEncoder.encode(str_date, “utf-8”);

    *// 從cookie中取值之後,對時間進行解碼
    *String decode_value = URLDecoder.decode(value, “utf-8”);

  4. 設置cookie的存活時間:我們不需要計算出cookie具體需要存活多少秒,只需要給出計算表達式即可,例如存活一天,是606024秒
    // 設置cookie的存活時間爲3個月
    cookie.setMaxAge(6060
    24303);

案例主要代碼

    // 設置是否包含lastTime的標記
    Boolean haveCookie = false;
    // 設置發送編碼格式,即設置響應頭Content-type的值
    response.setContentType("text/html;charset=utf-8");

    // 1.獲取Cookie對象,判斷有沒有名爲lastTime的Cookie對象
    Cookie[] cookies = request.getCookies();
    if (cookies != null && cookies.length > 0){   // 若存在Cookie對象,則查找是否包含lastTime
        for (Cookie c:cookies ) {
            String name = c.getName();
            if ("lastTime".equals(name)){   // 3.若存在lastTime對象,則不是首次訪問
                haveCookie = true;
                // 3.1獲取lastTime對象的值
                String value = c.getValue();
                // 對時間進行解碼
                String decode_value = URLDecoder.decode(value, "utf-8");
                // 3.2給客戶端發送提示信息
                response.getWriter().write("歡迎回來,您上次訪問時間爲:" + decode_value);
                // 3.3重新寫入lastTime當前時間
                Date date = new Date();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                String str_date = sdf.format(date);
                String encode_date = URLEncoder.encode(str_date, "utf-8");

                c.setValue(encode_date);
                // 設置cookie的存活時間爲3個月
                c.setMaxAge(60*60*24*30*3);
                response.addCookie(c);
                break;
            }
        }
    }

    // 2.若不存在lastTime,則是第一次訪問
    if (haveCookie == false){
        // 2.0獲取當前時間
        Date date = new Date();
        // 設置時間格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String str_date = sdf.format(date);
        // 對時間進行URL編碼
        String encode_date = URLEncoder.encode(str_date, "utf-8");
        // 2.1聲明一個Cookie對象
        Cookie cookie = new Cookie("lastTime", encode_date);
        // 設置cookie的存活時間爲3個月
        cookie.setMaxAge(60*60*24*30*3);
        // 2.2發送給客戶端
        response.addCookie(cookie);
        // 2.3給客戶端發送提示消息
        response.getWriter().write("您好,歡迎您首次訪問!");
    }

JSP改進案例

*通過上述程序,我們可以在頁面展示登陸時間;然而不能再繼續增加html標籤等其他內容;實際應用不便

簡單學習了JSP之後, 便可以將此實現放入jsp頁面,同時還可以增加html標籤其他內容;與實際效果相近, 然此法導致jsp頁面過於混亂, 故實際開發可能不是用此方法。

    <%@ page import="java.net.URLDecoder" %>
    <%@ page import="java.util.Date" %>
    <%@ page import="java.text.SimpleDateFormat" %>
    <%@ page import="java.net.URLEncoder" %><%--
      Created by IntelliJ IDEA.
      User: sheng
      Date: 2019/9/13
      Time: 21:04
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>home</title>
      </head>
      <body>
        <%
          // 設置是否包含lastTime的標記
          Boolean haveCookie = false;
    
          // 1.獲取Cookie對象,判斷有沒有名爲lastTime的Cookie對象
          Cookie[] cookies = request.getCookies();
          if (cookies != null && cookies.length > 0){   // 若存在Cookie對象,則查找是否包含lastTime
            for (Cookie c:cookies ) {
              String name = c.getName();
              if ("lastTime".equals(name)){   // 3.若存在lastTime對象,則不是首次訪問
                haveCookie = true;
    
                // 3.1獲取lastTime對象的值
                String value = c.getValue();
                // 對時間進行解碼
                String decode_value = URLDecoder.decode(value, "utf-8");
                // 3.2給客戶端發送提示信息
        %>
          <h1>
            歡迎回來,您上次訪問時間爲:<%= decode_value %>
          </h1>
        <%
                // 3.3重新寫入lastTime當前時間
                Date date = new Date();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                String str_date = sdf.format(date);
                String encode_date = URLEncoder.encode(str_date, "utf-8");
    
                c.setValue(encode_date);
                // 設置cookie的存活時間爲3個月
                c.setMaxAge(60*60*24*30*3);
                response.addCookie(c);
                break;
              }
            }
          }
    
          // 2.若不存在lastTime,則是第一次訪問
          if (haveCookie == false){
            // 2.0獲取當前時間
            Date date = new Date();
            // 設置時間格式
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String str_date = sdf.format(date);
            // 對時間進行URL編碼
            String encode_date = URLEncoder.encode(str_date, "utf-8");
            // 2.1聲明一個Cookie對象
            Cookie cookie = new Cookie("lastTime", encode_date);
            // 設置cookie的存活時間爲3個月
            cookie.setMaxAge(60*60*24*30*3);
            // 2.2發送給客戶端
            response.addCookie(cookie);
            // 2.3給客戶端發送提示消息
        %>
            <h1>
              您好,歡迎您首次訪問!
            </h1>
        <%
          }
        %>
        登錄<input type="text" >
    
      </body>
    </html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章