session:会话
1、有始有终的一系列动作、消息:浏览器窗口从打开到关闭期间
2、在客户端和服务器间保持状态的解决方案
3、这种解决方案的存储结构:把*保存到session里
面向连接:通信双方通信前建立通信渠道
保持状态:通信的一方能把一系列消息关联起来,消息间互相依赖
cookie:
包含:名字 值 过期时间 路径和域
通http协议分发,服务器在http响应头加一行特殊指示提示浏览器生成cookie;JavaScript VBScript 也可生成cookie
区别:
session存在服务器端,客户端不知道;cookie存在客户端,服务器知道
session存对象,cookie存字符串
session不区分路径;cookie区分路径,同一网站不同路径下的cookie互访不到
session借助cookie
session机制:
服务器端机制,当程序需要为某个客户端的请求创建一个session的时,服务器检查客户端请求是否已包含session标识 - 称为session id,如已包含session id则已为此客户端创建过session,按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如请求不包含session id,为此客户端创建session并生成与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。
存session id的方式可采用cookie,如被禁,可通URL重写(附url后:1 路径的附加信息、2查询字符串附加)表单隐藏技术
javax.servlet.http.HttpSession
Java平台对session机制的实现规范,接口
一般session存在内存里,服务器进程停止、重启,内存清;如果设置持久化,存硬盘
常见问题
session何时创建:
server程序调用HttpServletRequest.getSession(true),不使用,jsp中关闭,默认使用
何时被删除:
1、 程序调用HttpSession.invalidate(); 2 、到期 3、服务器进程被停止
HttpSessionListener
监控session的创建和销毁事件,session的创建和销毁动作触发listener
如何防止用户打开两个浏览器窗口操作导致的session混乱
通过设置客户端的令牌来解决,服务器每次生成不同的id给客户端的同时保存在session里,客户端提交表单时必须把这个id也返给服务器,程序首先比较id,不一致说明已经提交过了;不要再window.open打开的窗口中做修改操作(一般不设置id)
跨应用程序的session共享
terracotta:分布式Java集群技术
配置文件、共享、细粒度
中心辐射的架构,懒加载细粒度拷贝、线性扩展:序列化对象消耗降低、提高cpu使用率、内存无缝隙线性扩展:zk
在这种架构里运行着分布式应用程序的JVM们在启动时都会与一台中心Terracotta服务器相连,Terracotta服务器负责存储DSO对象数据,协调JVM之间的并发线程,Terracotta库位于应用程序JVM中,在类加载过程中,它们用来对类的字节码进行增强,处理同步块内的lock和unlock请求,处理应用JVM之间的wait(),notify()请求,处理运行时和Terracotta服务器的联系等等
能做:
DSO频繁访问的重要数据缓存在TCServer上,供集群不同jvm共享
http session复制、spring security整合、hibernate整合、分布式缓存(整合ehcache quartz)
POJO集群:spring框架引入,bean可分布式集群,无缝扩展web系统,故障转移机制
跨集群jvm实现分布式应用程序协调(代码注入)TCServer可配置成集群 高可用
为啥:
不改变代码提供HA HP优秀解决方案
1、sessino数据的共享,不使用广播机制,避免了Java序列化,只把被修改的字段的数据传递给服务器和使用节点,大大减少CPU和内存消耗
2、利用服务器实现网络扩展内存,使得有限内存的客户端节点可以访问远大于其内存容量的数据结构,而不必担心发生内存溢出的异常
3、数据保存在服务器端,因此客户端JVM宕机不会造成数据丢失
4、增量数据传递,智能数据推送,最大限度减少对网络的负担,使得客户端JVM可以横向扩展
5、服务器分片,实现服务器数据存储及数据吞吐量横向扩展
6、通过服务器实现共享数据持久化,通过服务器集群实现容错等
7、 无需学习新的API,大大降低开发成本
8、 广泛支持各种应用服务器:WebLogic, WebSphere, Tomcat, JBoss, Jetty, Geronimo等等,自动session数据迁移,集群范围内数据可视以及强大的管理和监控功能界面,大大方便对整合集群的共享数据、性能数据、软硬件指标等的实施监控、调试、优化(通过JMX开放服务器监控信息)
注入与字节码
配置文件配置后,程序类加载到jvm时,通过字节码增强技术偷偷注入分布式集群行为
类的字节码在加载时由terracotta进行解析和检查,字节码传递到jvm重新构造一个类:此前字节码据配置被修改
ROOT 集群对象图
集群从共享对象的根开始,root可通过配置文件中的*域进行配置,当一个root被实例化,该对象及其所能到达的all对象变集群对象,各域对象数据传递到服务器由其存储,terracotta客户端从服务器获取root对象,本地堆实例化、将引用付给对应域,透明进行
细粒度更改复制
将变化的DSO对象发送到特定的JVM上(含在jvm堆上实例化了的terracotta对象)原子性
对象的标识和序列化
对象变化记录局限在对象域层次且只含DSO片段,变化:发送对象ID 域ID 含变化字段的字节( 保持对象唯一性)
对某个DSO,任何给定时刻一个jvm在堆中只拥有一个对他的实例引用,多个jvm间分享和同步对象
虚拟堆 网络内存
共享对象图不能够放在单个jvm堆中,保持分布式对象图的配置窗口,超过阈值按策略flush out,使用时从服务器中取出放jvm堆中
https://www.cnblogs.com/albertwx/p/5757768.html
https://www.cnblogs.com/qin-derella/p/6808436.html
https://blog.csdn.net/u010164936/article/details/56666285 Tomcat配置还是比较详细的
https://www.cnblogs.com/study-everyday/p/7853145.html
参考:
https://www.cnblogs.com/lonelydreamer/p/6169469.html