在使用shiro的session的时候感觉对于tomcat中session的管理还不是特别清楚,而且session管理作为tomcat中比较重要的一部分还是很有必要学习的。
目录
- 概述
- session的作用
- session新建、查找和更新
- session删除
- 总结
概述
在tomcatsession管理的类标准实现为StandardManager,主要作用为启动的是加载缓存的session,类关系如下:
在用户servlet中使用的session为StandardSessionFacade(也是使用了facade模式,类似request),类关系如下:
session的作用
因为http协议是无状态的,但是在实际使用中我们需要知道上次请求保存在服务器端的数据,这个时候就用到了session,结合客户端的cookie就可以实现暂时在服务器端存储部分数据。但是注意,cookie并不是仅仅为了配合session而存在,cookie主要用来客户端来存储一些数据。和普通cookie不一样的地方是,和session相关的cookie 是由服务器端返回给浏览器,由浏览器自动设置的,不需要开发人员参与。
session新建、查找和更新
session新建
因为在一次请求中session不是必要的,所以tomcat 不是一定会创建session,只有在使用到了才会创建新的session,比如在UserServlet中使用到了session,创建过程如下:
非红框圈住的部分是session新建的过程,在request.addSessionIdInternal方法中将session作为cokkie设置到response头信息中,浏览器中收到"set-cookie"头信息的时候会将该头信息的值设置到cookie中,下次请求的时候会带上。
session查找
当同一个客户端在有效时间内(默认是30分钟,也是session的默认过期时间)第二次请求来了的时候,在CoyoteAdapter.postParseRequest方法内解析request请求头信息获取cookie(如果有的话),然后将cookie作为sessionId(其实cookie就是sessionId)设置到request对象中,在servlet 中调用getSession的时候,如果根据该sessionId查找到了session,则不会新建,否则才会新建。
调用过程如上图中左上方的红框。
session更新
因为session有过期时间,tomcat会记录该session的lastAccessedTime,更新session也就是更新这个时间,调用过程如上图中最下面的红框。
session删除
默认session是有过期时间,而且保存在内存中的,如果,一直不删除session,最后肯定会撑爆内存,在tomcat 中删除session的情况有两种:
- 在新的请求来的时候,如果查找到对应的session了会验证session是否可用(过期),如果过期了就会删除该session
- 在daemon线程(ContainerBase$ContainerBackgroundProcessor.processChildren中StandardContext->ContainerBase.backgroundProcess中调用StandardManager->ManagerBase.backgroundProcess)中定时检查是否过期,如果 过期则删除。
总结
到这里tomcat源码阅读基本上已经完成,大体脉络已经很明确,收获颇多,第一次阅读源码确实感觉到了一个好的开源项目的强大之处。
这段时间来的图(使用astah绘制)和笔记