Cookie 技术与 Session 会话

什么是Cookie?

  1. Cookie 是服务器通知客户端保存键值对的一种技术
  2. 客户端有了 Cookie 后,客户端的每次请求都会发送给服务器
  3. 每个 Cookie 的大小不能超过 4 kb。
  4. java 中使用 Cookie 技术需要导入 javax.servlet.http.Cookie

代码格式:

1
Cookie cookie = new Cookie("key1", "value1")

​创建好 Cookie 后需要通知浏览器保存 Cookie,否则无效:

1
2
// 通过响应头告诉浏览器需要将 Cookie 保存下来,从浏览器上看到 响应头为: Set-Cookie
resp.addCookie(cookie)

​Cookie 的创建,一次可以创建多个,可以一起传递给浏览器保存。

代码格式:

1
2
// 获取客户端传来的 Cookie 构成的 Cookie 数组
Cookie[] cookies = req.getCookie()

​Cookie 对象可以通过 getName() 方法 和 getValue() 方法来获取 Cookie 对象的键或值:

1
2
3
4
5
6
// for 循环遍历 Cookie 数组
for (Cookie cookie : cookies){
String key = cookie.getName();
String value = cookie.getValue();
System.out.println("Set-Cookie: " + key + " = " + value);
}

​从浏览器中请求头可以看到 Cookie ,里面的数据就是一对或多对键值对数据,也正是发送给服务器的 Cookie 数据。

​在开发中若想获取某个单独的 Cookie 对象,可以通过遍历来进行获取。

方案一:

  1. 先创建一个需要修改同名的 Cookie 对象

  2. 在构造器中,同时赋予新的 Cookie 值

  3. 调用 response.addCookie( cookie ) 告诉浏览器保存修改

    1
    2
    3
    4
    5
    // 1. 先创建同名 Cookie 对象
    // 2. 同时在构造器中赋予新 Cookie 值
    Cookie cookie = new Cookie("同 Cookie 键名", "Cookie 新值")
    // 3. 通过响应头,告诉浏览器保存修改
    response.addCookie( cookie );

方案二:

  1. 先查找到需要修改的 Cookie 对象
  2. 对 Cookie 对象调用 setValue() 方法对值进行修改
  3. 调用 response.addCookie( cookie ) 告诉浏览器保存修改

注意:Cookie 值不应包含空格、方括号、圆括号、等号、双引号、斜杆、问号、at 符号、冒号 和 分号,而且空值的 Cookie 在不同浏览器有着不同的处理方式。

Cookie 的生命周期的控制指的是如何管理 Cookie 什么时候被销毁(删除)

可以通过对 Cookie 对象调用 setMaxAge() 方法来设置 Cookie 存在的时间

setMaxAge() 方法:

  1. 传入零时,表示马上删除 Cookie
  2. 传入正值时,表示在指定秒数后过期
  3. 传入负值时,表示浏览器关闭(即会话关闭),Cookie 也一同被删除
  4. 默认值为 -1,即浏览器关闭 Cookie 就会被删除

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

例如:

CookieA 的 path = “/工程路径”

CookieB 的 path = “/工程路径/demo”

  1. 若请求地址为: http://ip:port/工程路径/test.html

    a) CookieA 发送

    b) CookieB 不发送

  2. 若请求地址为: http://ip:port/工程路径/demo/test.html

    a) CookieA 发送

    b) CookieB 发送

Session 技术

什么是 Session?

  1. Session 就是 HttpSession 接口实现类
  2. 它是用来维护一个客户端与服务端之间关联的一种技术
  3. 每个客户端都有自己的一个 Session 会话,Session 会话中,我们经常用来保存用户登入之后的信息

Session 的创建与获取

Session 创建与获取的 API 是相同的,都是 request.getSession()

当此方法第一次被调用时,创建 Session 会话对象,反之为获取之前创建的 Session 会话对象

我们可以用 isNew() 来判断一个 Session 对象是否是刚创建的,true 表示刚刚创建,false 表示是之前就创建了

每个会话都有一个 id 值,每个 id 值都是唯一的,我们可以通过 getId() 方法来获取 Session 会话对象的唯一 id

request.getSession(true):默认情况,为 true,若为 false ,则不管是否已有会话,都不会进行会话创建,且若没有会话则返回 null

Session 生命周期的控制

Session 的生命周期的控制指的是如何管理 Session 什么时候被销毁(删除)

Session 的超时时间是指客户端两次向服务器请求的时间间隔,若未超出这个时间间隔,则会话不会销毁,反之销毁

可以通过 setMaxInactiveInterval( int interval ) 方法设置单个会话超时时间,通过 getMaxInactiveInterval() 获取会话超时时间

对于 setMaxInactiveInterval(int interval) 方法:

  1. 传入正值时,即表示设置的 Session 超时时长,单位为秒
  2. 传入负值时,表示 Session 会话永不超时(极少使用)

想让 Session 会话无效,则需要调用 invalidate() 方法,此方法会使会话无效,且取消任何绑定到该会话对象的对象

Session 的默认超时时长可以通过 web.xml 配置文件进行修改,Tomcat 服务器下所有 Session 超时配置默认时长为 30 分钟:

1
2
3
<session-config>
<session-timeout>30</session-timeout>
</session-config>

所以我们可以在自己的 Web 工程目录下的 web.xml 文件中配置当前工程所有默认会话的超时时长。