文章目录
- 需求
- 分析
- 示例代码
需求
1.访问一个Servlet,如果获取不到上一次访问的时间,则提示:您好,欢迎访问。
2.如果可以获取上一次访问的时间,则提示:您好,欢迎回来,您上次访问时间为:显示时间字符串
分析
在服务器中的Servlet判断是否有一个名为 lastTime 的 cookie
1.有
则响应数据:您好,欢迎回来,您上次访问时间为:2018年6月10日11:50: 20
写回 Cookie:lastTime=2018年6月10日11 :50:01
2.没有
响应数据:您好,欢迎访问
写回 Cookie:lastTime=2018年6月10日11 :50:01
示例代码
package priv.lwx.cs.example;
/*** 通过Cookie保存用户最后一次访问的时间** @author liaowenxiong* @date 2022/1/14 16:39*/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 java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;@WebServlet("/last_time")
public class SaveLastTimeByCookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");boolean flag = false;PrintWriter writer = response.getWriter();// 获取所有的CookieCookie[] cookies = request.getCookies();// 遍历Cookie数组,查找是否存在名为lasttime的Cookieif (cookies != null && cookies.length != 0) {for (Cookie cookie : cookies) {String name = cookie.getName();if ("lastTime".equals(name)) {// 存在名为lastTime的Cookie,则将变量flag的值设为trueflag = true;String value = cookie.getValue();// value是application/x-www-form-urlencoded字符串,需要解码String decDate = URLDecoder.decode(value, "utf-8");writer.write("<h1>您好,欢迎回来,您上次访问的时间:" + decDate + "</h1>");// 获取系统当前时间Date date = new Date();// 创建日期格式对象SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");// 格式化日期对象,返回一个日期字符串String strDate = sdf.format(date);System.out.println("URL编码前:" + strDate);// URL编码,因为Cookie无法存储空格等特殊字符,所以只能将含有空格的字符串转换成application/x-www-form-urlencoded字符串进行存储String encDate = URLEncoder.encode(strDate, "utf-8");System.out.println("URL编码后:" + encDate);// 用最新的系统时间替换名为lastTime的Cookie中旧的日期值cookie.setValue(encDate);// 将名为lastTime的Cookie添加到Response对象中response.addCookie(cookie);break;}}}// 没有名为lastTime的Cookieif (cookies == null || cookies.length == 0 || flag == false) {// 获取系统当前时间Date date = new Date();// 创建日期格式对象SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");// 格式化日期对象,返回一个日期字符串String strDate = sdf.format(date);System.out.println("URL编码前:" + strDate);// URL编码,因为Cookie无法存储空格等特殊字符,所以只能将含有空格的字符串转换成application/x-www-form-urlencoded字符串进行存储String encDate = URLEncoder.encode(strDate, "utf-8");System.out.println("URL编码后:" + encDate);// 创建CookieCookie cookie = new Cookie("lastTime", encDate);// 设置Cookie的存活时间为1个月cookie.setMaxAge(30*24*60*60);response.addCookie(cookie);writer.write("<h1>您好,欢迎访问!</h1>");}}
}
注意:Cookie无法保存空格等字符串,需要进行URL编码进行保存,服务端取值时要URL解码