Tomcat的JessionId
tomcat会生成jessionId传递给浏览器,浏览器保存在会话cookie中,当浏览器再去向服务器发送请求的时候,这个jessionId也会发送到服务器端,通过jessionId来找到服务器端为用户维持的一个session。我想求教的是,这个jessionId是在什么时候生成并发送给浏览器的呢?···为什么我第一次访问服务器的时候,这个jessionId已经存在到http的header中了?···
------解决方案--------------------jessionid是用来标示session的唯一值的。你可以认为产生一个session,就会产生对应的一个jessionid。
但是这个jessionid是保存在cookie中的,所以你请求的时候header中会带上从客户端的cookie中获取到的jessionid。
再来从session产生的角度阐述下:
登陆后,你的确得到了session,也拥有了一个session id(jsessionid),如果你一分钟不动,属于你的session会失效。但此时你的jsessionid并没有变(存在cookie中),因为此时你的jsessionid是放在了你浏览器的cookies中的。如果你这时进行操作,浏览器会将你的jsessionid传送到服务器(也就是你看到的header头中有),服务器拿这个jsessionid去找属于你的session,但不好意思,这时找不到了,因为超时后被干掉了。
------解决方案--------------------下面是Tomcat 生成SessionId 的代码,是会检查是否有重复的......
protected String generateSessionId() {
String result = null;
do {
if (result != null) {
// Not thread-safe but if one of multiple increments is lost
// that is not a big deal since the fact that there was any
// duplicate is a much bigger issue.
duplicates++;
}
result = sessionIdGenerator.generateSessionId();
} while (sessions.containsKey(result));
return result;
}
public String generateSessionId() {
byte random[] = new byte[16];
// Render the result as a String of hexadecimal digits
StringBuilder buffer = new StringBuilder();
int resultLenBytes = 0;
while (resultLenBytes < sessionIdLength) {
getRandomBytes(random);
for (int j = 0;
j <