以前一直不知道sessionId 是在什么地方生成的。一脸蒙圈。以及生成规则。
这个是在容器里生成的
今天扒了扒源码。 看的是springBoot 中 内嵌的tomcat 生成sessionId 的方式
在 这个 类 中: org.apache.catalina.util.StandardSessionIdGenerator
`
``java
public class StandardSessionIdGenerator extends SessionIdGeneratorBase {
public StandardSessionIdGenerator() {
}
public String generateSessionId(String route) {
byte[] random = new byte[16];
int sessionIdLength = this.getSessionIdLength();
StringBuilder buffer = new StringBuilder(2 * sessionIdLength + 20);
int resultLenBytes = 0;
while(resultLenBytes < sessionIdLength) {
this.getRandomBytes(random);
for(int j = 0; j < random.length && resultLenBytes < sessionIdLength; ++j) {
byte b1 = (byte)((random[j] & 240) >> 4);
byte b2 = (byte)(random[j] & 15);
if (b1 < 10) {
buffer.append((char)(48 + b1));
} else {
buffer.append((char)(65 + (b1 - 10)));
}
if (b2 < 10) {
buffer.append((char)(48 + b2));
} else {
buffer.append((char)(65 + (b2 - 10)));
}
++resultLenBytes;
}
}
if (route != null && route.length() > 0) {
buffer.append('.').append(route);
} else {
String jvmRoute = this.getJvmRoute();
if (jvmRoute != null && jvmRoute.length() > 0) {
buffer.append('.').append(jvmRoute);
}
}
return buffer.toString();
}
}``
由此可见。生成的sessionId 是 16个随机字节+jvmRoute信息,且jvmRoute默认为空字符串,设置的话需要通过系统变量jvmRoute获取。
理论上 分布式环境会存在重复的问题。