建议首先写一个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分钟才过期