一, 引言
动态网页兴起后, 会话管理变成开发者需要考虑的一个问题, 由于 HTTP 请求是无状态的, 为了区分每个用户, 此时引入了会话标识 (session id) 的概念, 但是存储机制也会产生不同的问题, 下面就详细分析一下三种机制的优缺点以及使用方式.
二, session
定义: 会话, 打开 web 应用时产生, 浏览器第一次访问服务器会在服务器端生成一个 session, 有一个 sessionid 和它对应.
创建: session 在访问 tomcat 服务器时调用 HttpServletRequest.getSession(true) 创建.(此时对应的 sessionid 也同时产生)
存储: session 的状态信息等储存在服务器的内存中, 但是 sessionid 是保存客户端的 cookie 中, 客户端不保存 session,session 销毁只能通过 invalidate 或超时失效, 关掉浏览器并不会关闭 session.
删除:(1) 超时;
(2) 程序调用 HttpSession.invalidate();
(3) 程序关闭;
存在的问题:(1) 负载均衡后, 每台机器间的 session 都需要相互复制, 很烦杂
(2) 单独把 session 拿出来存, 又会面临这台存 session 的服务器一宕机, 全部的用户都得重新登陆, 凉凉...
常见 QA:
Q: 浏览器关闭时, session 会同时关闭么?
A:session 并不会因为浏览器的关闭而删除! 关闭浏览器和 session 失效没有任何关系, session 本身有一个存活时间, 在 tomcat 中默认的是 30 分钟, 打个比方即使浏览器一直开着, 如果在 30 分钟内没有发出任何请求, 那原来存在服务器上的 session 域内的东西就全没有了, 再次访问的时候, 服务器会新建一个 session. 它的改变是通过 session.getMaxInactiveInterval() 改变的, 当关闭浏览器, 再打开浏览器访问的时候, 服务器会新建一个 session, 可以通过 session 的 ID 来判断是不是新的 session,session 的失效除了上述的超时, 还有调用 invalidate() 或者服务器重启或者中断, 所以如果当设置 session 的 MaxInactiveInterval 为 - 1(永不超时) 时, 并且关闭了浏览器, 那么你的 session 会一直存在, 除非重启服务器.
三, cookie
定义: 由服务器生成, 发送给浏览器, 浏览器把 cookie 以 kv 形式保存到本地某个目录下的文本文件内, 下一次请求同一网站时会把该 cookie 发送给服务器.
存储: 保存在本地客户端.
删除:(1) 超时;(设置了过期时间, cookie 过期后会存储在硬盘里面)
(2) 手动删除;
存在的问题:(1)cookie 不是很安全, 别人可以分析存放在本地的 cookie 并进行 cookie 欺骗.
(2)cookie 有安全隐患, 通过拦截或本地文件找得到你的 cookie 后可以进行攻击.
(3)cookie 有大小限制以及浏览器在存 cookie 的个数也有限制.
四, token
定义: 令牌, 是一种用户身份的验证方式.
创建: 第一次登录后, 服务器生成一个 Token 便将此 Token 返回给客户端
存储: token 一般储存在客户端的 cookie 中, 服务端生成后不保存 token(可以存在缓存中), 服务端处理每次请求, 只做 token 的校验工作而已.
常见组成方式: uid(用户唯一的身份标识) +time(当前时间的时间戳) +sign(签名, 由 token 的前几位 + 盐以哈希算法压缩成一定长的十六进制字符串, 可以防止恶意第三方拼接 token 请求服务器).
验证流程:(1) 用户通过用户名和密码发送请求.
(2) 程序验证.
(3) 程序返回一个签名的 token 给客户端.
(4) 客户端储存 token, 并且每次用于每次发送请求.
(5) 再次请求时, 服务端验证 token 并返回数据.
PS: 第一次登陆时, 客户端传账号和密码到服务器, 服务器先去查询数据库, 查询到用户信息后服务器再根据自己的规则生成 token 并缓存 (如 Redis 等技术), 再把 token 回传给客户端 (客户端可以把 token 存到 cookie 中).
第二次登陆时, 直接传 token 给服务器验证缓存中是否存在该 token; 也可以传账号密码给服务器, 让服务器再次生成一次 token, 用这次生成的 token 去缓存中校验是否存在.
来源: http://www.bubuko.com/infodetail-3167234.html