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