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