博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
How Tomcat works — 八、tomcat中的session管理
阅读量:7033 次
发布时间:2019-06-28

本文共 1609 字,大约阅读时间需要 5 分钟。

在使用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绘制)和笔记

转载于:https://www.cnblogs.com/sunshine-2015/p/5770903.html

你可能感兴趣的文章
防火线缆在建筑中的应用专题访谈
查看>>
linux常用命令整理 20150823
查看>>
类的const对象
查看>>
测试驱动开发基础
查看>>
第二次作业
查看>>
第4次作业类测试代码+105032014116+陈洁
查看>>
部队应急通信指挥调度方案
查看>>
post文本3-代码类
查看>>
form表单 无法提交js动态添加的表单元素问题。。
查看>>
Activiti流程图查看
查看>>
ArrayList源码解析-扩容
查看>>
HDU 1222 Wolf and Rabbit(gcd)
查看>>
c#中子线程控制进度条的一个简单例子(多线程问题)
查看>>
我被面试官问到的问题-3
查看>>
python 常用模块之os、sys、shutil
查看>>
centos7 安装mysql5.7及配置
查看>>
重写与重载
查看>>
pdf文件太大如何进行压缩,压缩pdf文件的步骤分享
查看>>
RTC介绍
查看>>
saltstack grains模块自定义
查看>>