引入:
提到Session技术的出现,就得想下之前的Cookie技术,这两种技术都是针对无状态的HTTP协议的短板,用于有状态的会话。那有了cookie为什么还玩session技术。由于cookie保存的信息在客户端,每次通过cookie发送给web服务器,那算上状态信息容量应该不小吧,这样就降低了网络传输的效率,并且传到web服务器那边,解析也是一个问题。而且cookie信息的容量不能超过4KB。不能传中文信息,不能传过去对象,只能是字符串。短板太多所以就出现的Session域对象。
Cookie和Session之间的区别:
如果我们拿会员卡去大超市,顶上只能有卡号和剩余金额,因为卡存储信息是有限的,所以我们去大超市买东西直接刷卡就ok了,虽然这种方式很方便,通过卡号就知道了对应的剩余金额(类似于cookie中的键值对的形式),但是短板也很明显,只能存这两样,如果还要记录每次消费的金额,每次消费的时间,以及对应这张卡的使用者信息,这张卡根本没这么多容量,这样如果卡丢了,都查不到使用者信息,就没法冻结了,为使用者产生很大不便。其中最主要的原因是卡容量小,信息多了,机器扫描卡信息会多花时间。这也就是类似于cookie,把信息都存在浏览器是不行的。然而使用另一种方式,就把卡存储一个卡号,机器里面存储卡号对应的其他信息。使用者拿卡去刷卡号就行了。这就是session技术,浏览器通过session的ID号与web服务器进行身份识别,来交互信息。所以session的信息是存储在服务器端的。
Session原理:
1.如果第一次访问session对象的话,就给session分配一个唯一的ID(也就是标记号),JSESSIONID。
2.就把JSESSIONID作为cookie的值发送到浏览器保存。
3.然后下次再去访问,浏览器拿着带有JSESSIONID的cookie访问服务器就完事了。
4.服务器收到JSESSIONID,就在服务器的内存中寻找是否有JSESSIONID对应的session对象。
5.如果找到了对应的编号的session对象,那么直接返回就完事了。
6.如果要是没找到对对应的编号的session对象,那么就创建新的session对象,然后就走步骤1的方式创建session对象。
Seesion的销毁:
Session的销毁并不是浏览器关闭时销毁的(根本八竿子打不着),要不就是你通过调用setMaxInactiveInterval(intinerval)方法,设置有效时间,到期失效。要不就直接调用invalidate()方法关闭它。