会话跟踪技术Session和Cookie

1,287 阅读3分钟

本文介绍Http请求中会话跟踪技术Session和Cookie的使用。

概念介绍

由于http协议最初被设计成是无状态的,所以用户每次发起http请求都会新起一个连接(即便是同一个用户,同一个域名),这样十分消耗资源,所以需要有一种技术来处理这个问题,会话跟踪就是这种技术。

会话:用户打开浏览器,访问服务器资源,会话建立,直到有一方断开,会话结束。一次会话中可以包含多次请求和响应。

会话跟踪:一种维护浏览器状态的方法,服务器需要识别请求是否来自于同一个浏览器,以便于在同一次会话中共享数据,用于提升性能

会话跟踪技术实现方式:

  1. 客户端:Cookie
  2. 服务端:Session

关于Cookie

Cookie是使用在客户端的一种会话跟踪技术,会将数据保存到客户端,以后每次请求都携带Cookie进行数据访问。

举个例子,我们在用户登录时服务端会生成token,然后服务端把token设置到cookie中,客户端后续对同一个域名的请求都会带上这个Cookie,默认情况下当用户关闭浏览器(即会话断开后)cookie会失效

Servlet中Response设置Cookie代码如下:

resp?.addCookie(Cookie("名字","值"))

Servlet获取客户端Cookie代码如下:

val cookies = req.cookies //Cookie对象数组
cookies.forEach { 
    val name = it.name
    val value = it.value
}

Cookie原理

Cookie实现是基于http协议,主要是用了http协议中的headers

  1. 响应头:set-cookie
  2. 请求头:cookie

服务端会往响应头里加一个set-cookie字段,浏览器会在请求头里加一个cookie字段,下面介绍Cookie的一些细节。

Cookie的一些细节

  • Cookie存活时间
    • 默认情况下,Cookie存储在浏览器内存里,当浏览器关闭,内存释放,Cookie会被销毁
    • 可以使用setCookie(int seconds)设置Cookie的存活时间
      • 正数:Cookie存入电脑硬盘,持久化存储,到期自动删除
      • 负数:Cookie仅存在浏览器内存里,浏览器关闭时被销毁
      • 0:删除对应Cookie
  • Cookie如何存储中文
    • 设置Cookie时先转码,之后取的时候在反编码即可(一般使用URLEncoder类)

关于Session

Session是一种服务端会话跟踪技术,用于将数据存储到服务端.

Session的使用

JavaEE提供HttpSession接口来实现Session的具体功能,HttpSession有以下几个方法:

val session = req.session
//获取数据
session.getAttribute("")
//设置数据
session.setAttribute("","")
//移除数据
session.removeAttribute("")

Session的原理

  • Session是基于Cookie实现的,在同一次会话中cookie中的JSESSIONID是同一个。
    • Tomcat服务器会自动处理sessionid过程
  • 同一个域名服务器下Servlet的请求获取到的session对象是同一个。

Session使用细节

  • Session的钝化和活化
    • 服务器重启后,Session中的数据是否还在?
    • 钝化:服务器正常关闭时会把session的信息存储到硬盘文件里
    • 活化:再次启动服务器会从文件中加载数据到session中
    • 浏览器关闭后再打开是一次新的会话
  • Session销毁
    • 默认情况保存30分钟,这个值可以在web.xml中使用<session-config>下的<session-timeout>属性配置(默认单位是分钟)
    • 手动调用Session对象的invalidate方法(用户退出时可以使用)

总结

  • Session与Cookie都是用来一次会话里多次请求共享数据的
  • 区别:
    • 存储位置:Cookie在客户端,Session在服务端
    • 安全性:Cookie不安全,Session安全
    • 数据大小:Cookie最大3KB,Session无限制
    • 存储时间:Cookie可以存很久,Session默认30分钟
    • 服务器性能:Cookie不占服务端资源,Session占用资源