还在迷惑什么是Cookie和Session?一篇文章让醍醐灌顶

举报
XiaoLin_Java 发表于 2022/01/12 16:42:27 2022/01/12
【摘要】 Cookie(饼干) 是服务器通知客户端保存键值对的一种技术。客户端有了 Cookie 后,每次请求都发送给服务器。

一、Cookie

1.1、Cookie概述

​ Cookie(饼干) 是服务器通知客户端保存键值对的一种技术。客户端有了 Cookie 后,每次请求都发送给服务器。每个 Cookie 的大小不能超过 4kb。

1.2、创建Cookie

image-20210118212323112

protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException,	IOException {
	//1 创建 Cookie 对象
    Cookie cookie = new Cookie("key","value");
    //2 相应给浏览器(客户端)
    Cookie cookie1 = new Cookie("key2","value2");
}   

1.3、服务器获取Cookie

image-20210118214300401

​ 服务器获取客户端的 Cookie 只需要一行代码:req.getCookies();,他返回的是一个Cookie数组。

1.4、Cookie工具类

​ 我们只做一个工具类,用于查找指定名称的 Cookie 对象。

public class CookieUtils {
/**
* 查找指定名称的 Cookie 对象
* @param name
* @param cookies
* @return
*/
	public static Cookie findCookie(String name , Cookie[] cookies){
		if (name == null || cookies == null || cookies.length == 0) {
			return null;
		}
		for (Cookie cookie : cookies) {
			if (name.equals(cookie.getName())) {//getName 方法返回 Cookie 的 key(名)
				return cookie;// getValue 方法返回 Cookie 的 value 值
                	}
		}
			return null;
	}
}

1.5、Cookie值的修改

1.5.1、方案一

  1. 先创建一个要修改的同名(指的就是 key)的 Cookie 对象。
  2. 调用 response.addCookie( Cookie );
// Cookie cookie = new Cookie("key1","Value1");
Cookie cookie = new Cookie("key1","newValue1");
// 调用 response.addCookie( Cookie ); 通知 客户端 保存修改
resp.addCookie(cookie);

1.5.2、方案二

  1. 先查找到需要修改的 Cookie 对象。
  2. 调用 setValue()方法赋于新的 Cookie 值。

1.6、浏览器查看Cookie

1.6.1、谷歌

image-20210119142227292

1.6.2、火狐

image-20210119142241876

1.7、Cookie的生命控制

​ 我们可以管理Cookie 什么时候被销毁,这就是Cookie的生命控制。我们用setMaxAge()方法来控制。

参数值 意义
正数 表示在指定的秒数后过期
负数 表示浏览器一关闭,Cookie 就会被删除(默认值是-1)
表示马上删除Cookie
/**
* 设置存活 1 个小时的 Cooie
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
	Cookie cookie = new Cookie("life3600", "life3600");
	cookie.setMaxAge(60 * 60); // 设置 Cookie 一小时之后被删除。无效
	resp.addCookie(cookie);
	resp.getWriter().write("已经创建了一个存活一小时的 Cookie");
}

/**
* 马上删除一个 Cookie
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
    // 先找到你要删除的 Cookie 对象
Cookie cookie = CookieUtils.findCookie("key4", req.getCookies());
	if (cookie != null) {
		// 调用 setMaxAge(0);
		cookie.setMaxAge(0); // 表示马上删除,都不需要等待浏览器关闭
		// 调用 response.addCookie(cookie);
		resp.addCookie(cookie);
		resp.getWriter().write("key4 的 Cookie 已经被删除");
	}
}

/**
* 默认的会话级别的 Cookie
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
	Cookie cookie = new Cookie("defalutLife","defaultLife");
	cookie.setMaxAge(-1);//设置存活时间,浏览器一关闭就销毁
	resp.addCookie(cookie);
}

1.8、Cookie 有效路径的设置

​ Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器,哪些不发。path 属性是通过请求的地址来进行有效的过滤。

二、Session

2.1、Session概述

​ Session 就是会话,Session 本质上是一个借口(HttpSession)。它是用来维护一个客户端和服务器之间关联的一种技术。

​ 每个客户端都有自己的一个 Session 会话,我们经常用来保存用户登录之后的信息。

2.2、Session 域数据的存取

/**
* 往 Session 中保存数据
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
	req.getSession().setAttribute("key1", "value1");
	resp.getWriter().write("已经往 Session 中保存了数据");
}
/**
* 获取 Session 域中的数据
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
	Object attribute = req.getSession().getAttribute("key1");
	resp.getWriter().write("从 Session 中获取出 key1 的数据是:" + attribute);
}

2.3、Session 生命周期控制

public void setMaxInactiveInterval(int interval):设置 Session 的超时时间(以秒为单位),超过指定的时长,Session就会被销毁。值为正数的时候,设定 Session 的超时时长。负数表示永不超时(极少使用)。

public int getMaxInactiveInterval():获取 Session 的超时时间。Session 默认的超时时间长为 30 分钟。

public void invalidate():让当前Session 会话马上超时无效。

image-20210119160945481

protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
	// 先获取 Session 对象
	HttpSession session = req.getSession();
	// 设置当前 Session3 秒后超时
	session.setMaxInactiveInterval(3);
	resp.getWriter().write("当前 Session 已经设置为 3 秒后超时");
    // 让 Session 会话马上超时
	session.invalidate();
    resp.getWriter().write("Session 已经设置为超时(无效)");
}

2.4、Session原理

​ Session 技术,底层其实是基于 Cookie 技术来实现的。

image-20210119161129071

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。