使用构造方法创建,输入键值对即可,可以同时创建多个 Cookie,然后都输入到响应头中让浏览器保存。

1
2
3
4
Cookie cookie=new Cookie("Tempest", "Yukino");
Cookie cookie1=new Cookie("Yuuki", "Asuna");
resp.addCookie(cookie);
resp.addCookie(cookie1);

Cookie 的生命周期由 setMaxAge() 来设置,有三种值:

  1. 正整数 表示经过这个正整数秒之后,这个 Cookie 过期。

  2. -1 表示 Cookie 生命周期为会话级别,关闭浏览器就删除(其实就没写进内存)

  3. 0 表示立刻删除 Cookie,立刻的意思是字面意思,浏览器接收到响应就删了。

1
2
3
4
5
6
7
Cookie[] cookies = req.getCookies();
for(Cookie i:cookies) {
i.setMaxAge(3600); //一小时后删除
i.setMaxAge(-1); //关闭浏览器就删除
i.setMaxAge(0) //立刻删除
resp.addCookie(i);
}

因为对于浏览器接收到一个 Cookie 之后,会先查看有没有 Name、Path 和 Domain 都一样的 Cookie,如果有,那么就去修改这个 Cookie 的 Value 属性为新接收到的 Cookie 的 Value 值。如果没有,则创建一个新的 Cookie 去保存里面的内容。

所以对一个 Cookie 进行修改或删除的时候,尽量先获取这个 Cookie,然后设置 Value 或者修改其 age 为 0;

1
2
3
4
Cookie[] cookies=req.getCookies();
Cookie cookie = WebUtils.findCookie("Yuuki", cookies);
cookie.setValue("Xorex");
resp.addCookie(cookie);

Domain 和 Path

这个属性是定义在怎样的域名和路径下,才会发送 Cookie 给服务器。

对于一个访问地址: http://xorex.space:8080/BookStore/manager 设定 Cookie 只在访问这里的时候发送:

Path 设置为:/BookStore/manager

Domain 设置为:xorex.space

需要注意的是,这里定义的限制 Cookie 发送指的是只有访问地址为 Domain+Path 的子地址才会发送 Cookie,比如 Path 的子地址:/BookStore/mananger/xorex/index.jsp 和 Domain 的子地址:bookstore.xorex.space 都符合发送 Cookie 的要求,而且这里 Cookie 的限制是无视端口号的。

Session

Session 概述

Session 指的是一个会话,会话是指一个终端用户与交互系统进行通讯的过程。在 Web 里面就是从开发访问网页执行一定的操作之后最后关闭网页的过程。

首先服务器里面有一个 Session 池,里面负责存储和生成 Session 对象,当客户端第一次访问服务器的时候,是肯定不会包含带有 Session ID 值的 Cookie 的。那么服务器会把它当作一个会话的开始,为这个客户生成一个 Session 对象,保存到 Session 池中,然后将这个 Session 对象的 Session ID 写入响应头的 Cookie 中,让浏览器保存下来,作为会话的认证标志。

从一次之后的所有交互中,客户端都会将 Session ID 的 Cookie 放到请求头中,服务器通过这个 Session ID 从 Session 池中找到客户的 Session 对象来进行操作。Session 实例中同样拥有可以设置属性的域,会伴随这 Session 实例可以随意获取。

Session 创建和获取

1
2
HttpSession session=req.getSession(); //会自动决定是生成新的 Session 还是去 Session 池中去取。
session.getID() //获取 Session 的 ID 值。

Session 生命周期控制

Session 销毁

Session 的销毁有三种情况:

  1. 当 Session 硬是熬过了有效期之后,服务器会自动销毁此 Session。

  2. 当客户关闭浏览器,使保存了 Session ID 的 Cookie 被销毁,从而无法通过 Session ID 从 Session 池中获取客户的 Session 对象,然后等到默认设置的销毁时间之后,服务器再物理销毁 Session 实例。

  3. 另外一种则是服务器主动销毁,当使用 Session 的 invalidate() 方法之后,会主动将 Session 中的所有用户信息全部清除,然后此 Session 被禁用,和 request 的绑定也会被解除,但是 Session 对象还活着。当再次用 request 获取 Session 的时候,会从 Session 池中取出一个新的出来。

Session 存活时间设置

Java 中使用 setMaxInactiveInterval() 方法设置 Session 的最大失效间隔时间,单位秒。

当设置的时间为正数的时候,则等到经过指定时间后,Session 被销毁。

当设置时间小于等于零的时候,标志此 Session 永远不会被销毁。

1
session.setMaxInactiveInterval(100);