一、Cookie
1.1、Cookie概述
Cookie(饼干) 是服务器通知客户端保存键值对的一种技术。客户端有了 Cookie 后,每次请求都发送给服务器。每个 Cookie 的大小不能超过 4kb。
1.2、创建Cookie
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
服务器获取客户端的 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、方案一
- 先创建一个要修改的同名(指的就是 key)的 Cookie 对象。
- 调用 response.addCookie( Cookie );
// Cookie cookie = new Cookie("key1","Value1"); Cookie cookie = new Cookie("key1","newValue1"); // 调用 response.addCookie( Cookie ); 通知 客户端 保存修改 resp.addCookie(cookie); 复制代码
1.5.2、方案二
- 先查找到需要修改的 Cookie 对象。
- 调用 setValue()方法赋于新的 Cookie 值。
1.6、浏览器查看Cookie
1.6.1、谷歌
网络异常,图片无法展示
|
1.6.2、火狐
网络异常,图片无法展示
|
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 会话马上超时无效。
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 技术来实现的。