加入收藏 | 设为首页 | 会员中心 | 我要投稿 南平站长网 (https://www.0599zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

Tomcat 中的 Session 和 Cookie的爱恨情仇

发布时间:2019-05-16 07:14:49 所属栏目:外闻 来源:顿悟源码
导读:副标题#e# HTTP 是一种无状态通信协议,每个请求之间相互独立,服务器不能识别曾经来过的请求。而对于 Web 应用,它的活动都是依赖某个状态的,比如用户登录,此时使用 HTTP 就需要它在一次登录请求后,有为后续请求提供已登录信息的能力。 解决办法就是使

关键就在于会话唯一标识的生成,来看 Tomcat 的生成算法:

  • 随机获取 16 个字节
  • 使用 MD5 加密这些字节,再次得到一个 16 字节的数组
  • 遍历新的字节数组,使用每个字节的高低4位分别生成一个十六进制字符
  • 最后得到一个 32 位的十六进制字符串

核心代码如下:

  1. protected String generateSessionId() { 
  2.   byte random[] = new byte[16]; 
  3.   String jvmRoute = getJvmRoute(); 
  4.   String result = null; 
  5.   // 将结果渲染为十六进制数字的字符串 
  6.   StringBuffer buffer = new StringBuffer(); 
  7.   do { 
  8.     int resultLenBytes = 0; 
  9.     if (result != null) { // 重复,重新生成 
  10.       buffer = new StringBuffer(); 
  11.       duplicates++; 
  12.     } 
  13.     // sessionIdLength 为 16 
  14.     while (resultLenBytes < this.sessionIdLength) { 
  15.       getRandomBytes(random);// 随机获取 16 个字节 
  16.       // 获取这16个字节的摘要,默认使用 MD5 
  17.       random = getDigest().digest(random); 
  18.       // 遍历这个字节数组,最后生成一个32位的十六进制字符串 
  19.       for (int j = 0; 
  20.       j < random.length && resultLenBytes < this.sessionIdLength; 
  21.       j++) { 
  22.         // 使用指定字节的高低4位分别生成一个十六进制字符 
  23.         byte b1 = (byte) ((random[j] & 0xf0) >> 4); 
  24.         byte b2 = (byte) (random[j] & 0x0f); 
  25.         // 转为十六进制数字字符 
  26.         if (b1 < 10) {buffer.append((char) ('0' + b1));} 
  27.         // 转为大写的十六进制字符 
  28.         else {buffer.append((char) ('A' + (b1 - 10)));} 
  29.          
  30.         if (b2 < 10) {buffer.append((char) ('0' + b2));} 
  31.         else {buffer.append((char) ('A' + (b2 - 10)));} 
  32.         resultLenBytes++; 
  33.       } 
  34.     } 
  35.     if (jvmRoute != null) {buffer.append('.').append(jvmRoute);} 
  36.     result = buffer.toString(); 
  37.   } while (sessions.containsKey(result)); 
  38.   return (result); 

3.2 Session 过期检查

(编辑:南平站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读