Http请求通过Session和Cookie保持会话。
Session生成时机:request对象调用getSession方法时生成,服务器会为该Session对象生成一个唯一的ID。
服务器端响应客户端请求时会在报文头中设置Set-Cookie属性,该属性内容中有一个JSESSIONID即是Session对象的标识,返回后由浏览器进行处理。
客户端再次发送请求时,浏览器会在报文头中自动追加Cookie属性,该属性将JSESSIONID传到服务器端。在服务器端用request.getSession时会取得SessionId对应的对象而不会重新生成Session。
如果客户端请求的cookie中不包含JSESSIONID,服务端调用request.getSession()时就会生成并传递给客户端,此次响应头会包含设置cookie的信息。
如果客户端请求的cookie中包含JSESSIONID,服务端调用request.getSession()时就会根据JSESSIONID进行查找对象,如果能查到就返回,否则就跟没传递JSESSIONID一样;
访问方式:浏览器->服务器
1.如果servlet中没有调用request.getSession()方法,那么服务器永远都不会创建JSESSIONID。
2.如果servlet中调用request.getSession()方法那么情况分为以下两种情况:
2.1 如果是第一次访问servlet,那么request.getSession()会创建一个JSESSIONID,并且在响应头里面有设置:
Set-Cookie:JSESSIONID=********************************; Path=/虚拟项目名; HttpOnly
2.2 如果不是第一访问servlet,那么此次浏览器访问该项目的时候,请求头会带有:
Cookie:JSESSIONID=*********************************
request.getSession()会先去获取请求头的JSESSIONID,并且在服务器里面查找该ID,如果该session对象还存活(tomcat默认session的存活时间为30分钟,过了30分钟后,该session对象会被摧毁)则直接获取该session,如果该session已经被摧毁了,则重新又创建一个session对象,重复步骤2.1.
注意:jsp默认调用getSession()方法。
上述内容可用各种抓包工具自行查看。
Session销毁时机:
1、到达web服务设定的Session过期时间。
2、web服务停止。
3、手动调用session对象的invalidate方法。
Session的创建和销毁可以通过HttpSessionListener来监听,该监听器配置在web.xml中。