Cookie案例 – 記住上次訪問時間
案例需求
- 訪問一個服務資源Servlet,若果是第一次訪問,則提示:您好,歡迎您首次訪問!
- 若不是第一次訪問,則提示:歡迎回來,您上次訪問時間爲:顯示時間字符串
案例分析
- 假設tomcat部署在服務器後不再關閉,則當瀏覽器未關閉時,可以採用cookie會話來實現;若瀏覽器關閉,也可以設定
setMaxAge(int expiry)方法來設置Cookie存儲的時間 - 在服務資源Servlet中創建一個lastTime的Cookie對象;當客戶端訪問該資源時,通過查詢該Cookie對象是否存在即可知是否第一次訪問
- 若沒有lastTime的Cookie對象,則是第一次訪問
*響應數據:您好,歡迎您首次訪問!
*創建名爲lastTime的Cookie,並寫入數據:lastTime=“當前訪問時間” - 若有lastTime的Cookie對象,則不是第一次訪問
*響應數據:歡迎回來,您上次訪問時間爲:lastTime記錄的值
*重新寫入lastTime的Cookie:lastTime=“當前訪問時間”
- 若沒有lastTime的Cookie對象,則是第一次訪問
案例要點
-
響應編碼格式:由於需要給客戶端響應數據,且包含中文,所以需要設置響應頭,告知客戶端編碼格式
*response.setContentType(“text/html;charset=utf-8”); -
獲取登陸時間:新建一個Date對象獲取時間,然後新建一個SimpleDateFormat對象,設置時間格式,最後調用
SimpleDateFormat對象的format方法,爲獲取的時間設置格式
*Date date = new Date();
*SimpleDateFormat sdf = new SimpleDateFormat(“yyyy年MM月dd日 HH:mm:ss”);
*String str_date = sdf.format(date); -
空格不兼容問題:由於設置的時間格式中存在中文空格,導致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”); -
設置cookie的存活時間:我們不需要計算出cookie具體需要存活多少秒,只需要給出計算表達式即可,例如存活一天,是606024秒
// 設置cookie的存活時間爲3個月
cookie.setMaxAge(606024303);
案例主要代碼
// 設置是否包含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>