利用Cookie保存记录上一次站点访问时间

建议首先写一个Cookie的工具类,里面写了Cookie的增删改查方法这样在后面用起来比较爽
Cookie工具类代码如下:

  package com.accp.util;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

/**
 * 功能描述:
 * Cookie工具类(包含增删改查方法)
 * @Author: xiaoke
 * @Date:2018/10/25 14:30
 * @Description:
 */
public class CookieUtil {


    /**
     * 根据名字查询获取cookie
     * 注意二、从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。
     * 浏览器提交Cookie时只会提交name与value属性。
     * maxAge属性只被浏览器用来判断Cookie是否过期
     * @param request
     * @param name cookie名字
     * @return
     */
    public static Cookie getCookieByName(HttpServletRequest request, String name){
        Map<String,Cookie> cookieMap = ReadCookieMap(request);
        if(cookieMap.containsKey(name)){//查询Cookie中是否包含传进来的name
            Cookie cookie = (Cookie)cookieMap.get(name);//取出map中的Cookie
            return cookie;//返回cookie
        }else{
            return null;//如果没找到就返回空
        }
    }


    /**
     * 将cookie封装到Map里面
     * @param request
     * @return
     */
    private static Map<String,Cookie> ReadCookieMap(HttpServletRequest request){
        Map<String,Cookie> cookieMap = new HashMap<String,Cookie>();//实例化一个Map集合
        //获取浏览器访问访问服务器时传递过来的cookie数组
        Cookie[] cookies = request.getCookies();//这样便可以获取一个cookie数组
        if(null!=cookies){//cookies是否为空
            for(Cookie cookie : cookies){
                cookieMap.put(cookie.getName(), cookie);//添加cookie到Map集合
            }
        }
        return cookieMap;//返回一个Map集合
    }

    /**
     * 功能描述:添加Cookie
     * @auther: xiaoke
     * @date: 2018/10/29 15:37
     * @param: [response, name, value]
     * @return: boolean
     * @Description:
     */
    public static void addCookie(HttpServletResponse response, String name, String value){
        //cookie是不能跨域访问的就是不能跨浏览器。
        //用户访问过之后重新设置用户的访问时间,存储到cookie中,然后发送到客户端浏览器
        Cookie cookie = new Cookie(name.trim(), value.trim());
        cookie.setMaxAge(30 * 60);// 设置为30min(分)存活时间,默认值是以秒来计算的
        cookie.setPath("/");//可在同一应用服务器内共享方法
        //将cookie对象添加到response对象中,这样服务器在输出response对象中的内容时就会把cookie也输出到客户端浏览器
        response.addCookie(cookie);//添加到客户端
    }

    /**
     * 修改cookie
     * @param request
     * @param response
     * @param name
     * @param value
     * 注意一、修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,
     * 例如name、path、domain等,都要与原Cookie完全一样。
     * 否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。
     */
    public static boolean editCookie(HttpServletRequest request,HttpServletResponse response,String name,String value) {
        // 根据名字获取cookie
        Cookie cookieByName = getCookieByName(request, name);
            if(cookieByName!=null){
                System.out.println("原值为:"+cookieByName.getValue());
                cookieByName.setValue(value);
                cookieByName.setPath("/");//可在同一应用服务器内共享方法
                cookieByName.setMaxAge(30 * 60);// 设置为30min(分)存活时间
                System.out.println("被修改的cookie名字为:"+cookieByName.getName()+",新值为:"+cookieByName.getValue());
              addCookie(response,cookieByName.getName(),cookieByName.getValue());
              return  true;
             }
        return false;
    }

    /**
     * 功能描述:删除Cookie
     * @auther: xiaoke
     * @date: 2018/10/29 16:23
     * @param: [request, response, name]
     * @return: boolean
     * @Description:
     */
    public static boolean delCookie(HttpServletRequest request,HttpServletResponse response,String name){
        // 根据名字获取cookie
        Cookie cookieByName = getCookieByName(request, name);
        if(cookieByName!=null){
            cookieByName.setValue(null);
            cookieByName.setMaxAge(0);// 立即销毁cookie
            cookieByName.setPath("/");//可在同一应用服务器内共享方法
                    System.out.println("被删除的cookie名字为:"+cookieByName.getName());
                    response.addCookie(cookieByName);
           return true;
          }
         return false;
    }

}

然后在controller控制层登录的方法中判断Cookie是否存在,不存在就是第一次访问然后保存Cookie在Session里抛到jsp页面显示,如果存在就把Cookie上一次的访问时间存储在Session里然后在jsp页面显示代码如下:

   package com.accp.controller;

import com.accp.util.CookieUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Date;

@Controller
public class LoginController {

  @RequestMapping("/goLogin")
    public String login(HttpServletRequest request, HttpSession session, HttpServletResponse response){
        //根据name查询Cookie
        Cookie cook=CookieUtil.getCookieByName(request,"lastAccessTime");
        if(cook !=null){//判断cookie是否存在
            Date data=new Date(Long.parseLong(cook.getValue()));
            session.setAttribute("lastAccessTime","你上一次访问时间是"+data.toLocaleString());
        }else{//cookie不存在,第一次访问
            session.setAttribute("lastAccessTime","你是第一次访问哦!");
        }
         //添加cookie,每次刷新cookie的MaxAge的存活时间
        //每次添加相同Key的cookie,后面添加的Cookie会覆盖前面的Cookie
        //获取系统时间:System.currentTimeMillis()
         CookieUtil.addCookie(response,"lastAccessTime",String.valueOf(System.currentTimeMillis()));

         return "index";

    }

}

登录页面当前我的电脑系统时间是17:19分:
在这里插入图片描述
然后我点击登录进入欢迎页面,因为我是第一次登录所以会显示你是第一次访问哦:当前我的电脑系统时间是17:19分:所以说我下一次再登录的时候,页面显示上一次的访问时间应该就是17:19分
在这里插入图片描述
我隔了一分钟再一次登录:可以看到我上一次登录时间是17:19分,Cookie的有效时间我设置的是30分钟才过期
在这里插入图片描述


版权声明:本文为weixin_43844158原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。