欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Cookie案例--上次访问时间

程序员文章站 2024-03-20 13:51:22
...

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>