案例:记住上一次访问时间
1.需求:
①访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
②如果不是第一次访问,则提示:欢饮回来,您上次访问时间为:显示时间字符串
2.分析:
①可以采用Cookie来完成
②在服务器中的Servlet判断是否有一个名为lastTime的cookie
Ⅰ有:不是第一次访问
* 响应数据:欢迎回来,你上次访问时间为:2019年11月1日08:05:20
* 写回Cookie:lastTmie=2019年11月1日08:05:10
Ⅱ没有:是第一次访问
* 响应数据:您好,欢迎您是首次访问
* 写回Cookie:lastTmie=2019年11月1日08:05:10
package jason.lh.cookie; 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.text.SimpleDateFormat; import java.util.Date; /** * @Author: Jason * @Date: 2019/11/1 7:50 * @Version 1.0 */ @WebServlet("/CookieTest") public class CookieTest extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置响应的消息体的数据格式及编码 response.setContentType("text/html;charset=utf-8"); //①获取所有的Cookie Cookie[] cookies = request.getCookies(); boolean flag = false; //没有cookie为lastTime //②遍历Cookie数组 if ((cookies != null) & (cookies.length > 0)){ for (Cookie cookie : cookies) { //③获取cookie的名称 String name = cookie.getName(); //④判断名称是否是:lastTime if ("lastTime".equals(name)){ flag = true; //找到lastTime的cookie为true //有该cookie,不是第一次访问 //设置cookie的value值 //获取当前时间的字符串,重新设置cookie的值,重新发送cookie Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); String str_date = sdf.format(date); //解析时间格式 cookie.setValue(str_date); //设置cookie的存活时间; cookie.setMaxAge(60*60*24*30); //一个月 response.addCookie(cookie); //响应数据 //获取cookie的value值 String value = cookie.getValue(); response.getWriter().write("<h1>欢迎回来,你上次访问时间为:" + value + "</h1>"); break; } } } if (cookies == null || cookies.length == 0 || flag == false ){ //没有lastTime 表示第一次访问 //设置cookie的value值 //获取当前时间的字符串,重新设置cookie的值,重新发送cookie Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); String str_date = sdf.format(date); //解析时间格式 Cookie cookie = new Cookie("lastTime",str_date); cookie.setValue(str_date); //设置cookie的存活时间; cookie.setMaxAge(60*60*24*30); //一个月 response.addCookie(cookie); response.getWriter().write("<h1>您好,欢迎您是首次访问 </h1>"); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }运行结果:500错误
找到错误地方:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");之间有个空格:在tomcat 8 之后,cookie支持中文数据。
但是还是不支持特殊字符,还得用URL编码存储,URL编码解析。
修改后:
package jason.lh.cookie; 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.net.URLDecoder; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; /** * @Author: Jason * @Date: 2019/11/1 7:50 * @Version 1.0 */ @WebServlet("/CookieTest") public class CookieTest extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置响应的消息体的数据格式及编码 response.setContentType("text/html;charset=utf-8"); //①获取所有的Cookie Cookie[] cookies = request.getCookies(); boolean flag = false; //没有cookie为lastTime //②遍历Cookie数组 if ((cookies != null) & (cookies.length > 0)) { for (Cookie cookie : cookies) { //③获取cookie的名称 String name = cookie.getName(); //④判断名称是否是:lastTime if ("lastTime".equals(name)) { flag = true; //找到lastTime的cookie为true //有该cookie,不是第一次访问 //先获取前一次访问的cookie的value值 //响应数据 //获取cookie的value值,时间 String value = cookie.getValue(); System.out.println("解码前:" + value); //URL解码 value = URLDecoder.decode(value, "utf-8"); System.out.println("解码后:" + value); response.getWriter().write("<h1>欢迎回来,你上次访问时间为:" + value + "</h1>"); //再设置cookie的value值 //获取当前时间的字符串,重新设置cookie的值,重新发送cookie Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); String str_date = sdf.format(date); //解析时间格式 System.out.println("编码前:" + str_date); //URL编码 str_date = URLEncoder.encode(str_date, "utf-8"); System.out.println("编码后:" + str_date); cookie.setValue(str_date); //设置cookie的存活时间; cookie.setMaxAge(60 * 60 * 24 * 30); //一个月 response.addCookie(cookie); /*//响应数据 //获取cookie的value值,时间 String value = cookie.getValue(); System.out.println("解码前:" + value); //URL解码 value = URLDecoder.decode(value, "utf-8"); System.out.println("解码后:" + value); response.getWriter().write("<h1>欢迎回来,你上次访问时间为:" + value + "</h1>"); */ break; } } } if (cookies == null || cookies.length == 0 || flag == false) { //没有lastTime 表示第一次访问 //设置cookie的value值 //获取当前时间的字符串,重新设置cookie的值,重新发送cookie Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); String str_date = sdf.format(date); //解析时间格式 System.out.println("编码前:" + str_date); //URL编码 str_date = URLEncoder.encode(str_date, "utf-8"); System.out.println("编码后:" + str_date); Cookie cookie = new Cookie("lastTime", str_date); cookie.setValue(str_date); //设置cookie的存活时间; cookie.setMaxAge(60 * 60 * 24 * 30); //一个月 response.addCookie(cookie); response.getWriter().write("<h1>您好,欢迎您是首次访问 </h1>"); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
第一次的·忘了截图了