x:: 浏览器Cookie]

本篇博客主要内容是:

● Session简介;

● Session的设置和获取示例代码;

● Session的演示;

● 了解Session背后的原理;

问题 :Cookie是把用户信息存放在了本地,虽然加密了,但还是有破解的风险,不安全;同时,每次浏览器请求时,都需要额外传递Cookie信息,这无疑增加了带宽的负担;

所以,JavaWeb提供了一种新的实现方案,诸如“用户登录状态”或者“用户登录”的信息不再存储在浏览器这边,而是把这些信息存在服务器中;这就是引出了Session。


Session简介

● Session:将数据存储在服务器端;

● 默认情况下Session和前端的浏览器窗口绑定,并且Session在没有人访问的时候,时常是30分钟;(即一个浏览器窗口在服务器上有一个30分钟的存储空间)

● Session如何知道,某个浏览器窗口和服务器的哪一块存储空间对应嘞?在Session被创建后,Cookie中会保存一个叫SessionId的数据,通过SessionId可以向服务题提取只属于我自己这个浏览器窗口所对应的数据了;


设置Session,获取Session

Session常用方法:

request.getSession():获取Session对象;

get|set|removeAttribute():获取|设置|删除Session对象;

setMaxInactiveInterval:设置Session超时时间;

如下示例:

需要明白,一旦打开了一个浏览器窗口,Tomcat服务器就会在内存中开辟一块空间,存储这个浏览器窗口的Session对象,只要这个浏览器窗口不关闭,那么所有的请求就会公用一个Session对象,任何request.getSession();获得的都是同一块区域中的session对象(即是同一个对象)

情况一:打开浏览器,访问SessionLoginServlet:

情况二:在执行完情况一的操作后,不关闭浏览器窗口,而是重新访问SessionLoginServlet:

情况三:执行完情况一之后,不访问SessionLoginServlet了,而是直接访问:SessionIndexServlet:

情况四:关闭浏览器窗口,不访问SessionLoginServlet了,而是直接访问:SessionIndexServlet:

Session对象可以看成是与浏览器窗口绑定的对象,对于一个浏览器窗口中所产生的数据,Tomcat会为其创建一个单独的存储空间进行独立存放,每个浏览器窗口所对应的存储空间都是不同的,而存储空间的标识符就是上面的sessionId;

session对象:一个与浏览器窗口绑定的,把数据存放在Tomcat内存中的对象;这个对象有个专业名词就是Session;


Session原理

问题情况引入:

接上,访问SessionLoginServlet:

关闭浏览器窗口,重新打开一个新的窗口,再次访问SessionLoginServlet:

Session原理解释:

浏览器发起请求后到Tomcat后,Tomcat会为这个浏览器窗口(会话啦)分配一块内存空间空间,存放session对象,然后可以设置session对象属性等;然后Tomcat响应的的时候,会把SessionId返回给浏览器,浏览器将这个SessionId存放在cookie中,再次请求的时候,cookie的SessionId会跟着请求一并过来,从而可以根据SessionID访问Tomcat中的某个地址空间中的session对象了;

( _ _ 一旦浏览器窗口关闭了,那么本次会话也就over了,然后这个Session也跟着一起over了,那么这个Session在内存中的空间也被回收了?__ 不是哦:而是 关闭浏览器窗口时,只是将存储在浏览器中的那个JSESSIONID的cookie给抛弃了(但是,这个JSESSIONID在Tomcat内存中session对象并没有立即销毁;))

可以发现,Cookie是Session的基础


注解:

(1)一个会话一旦建立,Tomcat会自动在内存中创建一个Session对象,我们可以通过HttpSession session = request.getSession();来获取这个对象;

(2)cookie(大概率)也是浏览器自动创建的,浏览器会有一个存放所有Cookie对象的列表:然后我们也可以通过Cookie cookie = new Cookie(“user”,“admin”);自己创建一个cookie,然后通过response.addCookie(cookie); 响应返回给浏览器 ,然后浏览器会把这个返回的cookie添加到自己维护的cookie列表中;然后可以通过Cookie[] cs = request.getCookies();获得所有cookie的列表;

(3)换句话说,Session是Tomcat服务器创建和维护的;Cookie是浏览器创建和维护的;这是两个特殊的Java对象,这些对象有很多属性和方法,我们可以按需调用;