| 关键就在于会话唯一标识的生成,来看 Tomcat 的生成算法: 
    随机获取 16 个字节使用 MD5 加密这些字节,再次得到一个 16 字节的数组遍历新的字节数组,使用每个字节的高低4位分别生成一个十六进制字符最后得到一个 32 位的十六进制字符串 核心代码如下: protected String generateSessionId() {   byte random[] = new byte[16];   String jvmRoute = getJvmRoute();   String result = null;   // 将结果渲染为十六进制数字的字符串   StringBuffer buffer = new StringBuffer();   do {     int resultLenBytes = 0;     if (result != null) { // 重复,重新生成       buffer = new StringBuffer();       duplicates++;     }     // sessionIdLength 为 16     while (resultLenBytes < this.sessionIdLength) {       getRandomBytes(random);// 随机获取 16 个字节       // 获取这16个字节的摘要,默认使用 MD5       random = getDigest().digest(random);       // 遍历这个字节数组,最后生成一个32位的十六进制字符串       for (int j = 0;       j < random.length && resultLenBytes < this.sessionIdLength;       j++) {         // 使用指定字节的高低4位分别生成一个十六进制字符         byte b1 = (byte) ((random[j] & 0xf0) >> 4);         byte b2 = (byte) (random[j] & 0x0f);         // 转为十六进制数字字符         if (b1 < 10) {buffer.append((char) ('0' + b1));}         // 转为大写的十六进制字符         else {buffer.append((char) ('A' + (b1 - 10)));}                  if (b2 < 10) {buffer.append((char) ('0' + b2));}         else {buffer.append((char) ('A' + (b2 - 10)));}         resultLenBytes++;       }     }     if (jvmRoute != null) {buffer.append('.').append(jvmRoute);}     result = buffer.toString();   } while (sessions.containsKey(result));   return (result); } 
 3.2 Session 过期检查 (编辑:鹰潭站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |