Cookie案例--上次访问时间
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>
上一篇: 顺序表的各类接口实现
下一篇: cookie获取上次访问时间