| 
                         关键就在于会话唯一标识的生成,来看 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 过期检查                         (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |