目录:
- 精简总结
- 知识点
什么是HttpSesssion
怎么获取
与其他域对比
session的域方法
session的实现原理
一、 精简总结:
session域 – 一次会话中共享数据的域
为了让一次会话中的多次请求能共享数据,服务器给这次会话,创建一个session域,每次请求可以共享这个session域对象。
session域对象被第一次创建时,也会顺带创建一个sessionId(cookie),并通过响应头还给浏览器,浏览器保存这个包含sessionId的cookie(cookie对象的默认生命周期也是一次会话,即浏览器关闭就消失),并记录cookie对应的服务器,这样在这次会话中,其他所有请求的请求头都会带上这个cookie,也就带上了sessionId,服务器通过内部的map,通过sessionId找到对应的session。
例:
在一次会话中,如果用户登录成功,就为这次会话创建一个session,里面保存登录成功信息,让这次会话的其他请求共享这次登录成功信息。这样,服务器不用再对每一个请求判断是否登录成功。
服务器端:
- 创建session:HttpSession session = request.getSession() // 通过sessionId找到对应的session,如果浏览器没有包含sessionId,则创建一个session,如果通过sessionId找到了,则返回对应的session对象
- 得到session:HttpSession session = request.getSession()
- 请求共享session中的成功信息:request.getSesssion().getAttribute(“login”)
浏览器端:
保存包含sessionId的cookie
二、 知识点:
1.什么是HttpSesssion
是域对象,把一个会话内需要共享的数据保存到HttSession对象中。一个会话包括很多请求,这些请求之肯定要共享数据。如果想要跟踪一次会话,就创建HTTPSession对象,让这次会话的所有请求共享这个HTTPSession对象
2. 怎么获取
l HttpSession request.getSesssion(): 通过sessionId找到对应的session,如果浏览器没有包含sessionId,则创建一个session,如果通过sessionId找到了,则返回对应的session对象
3. 与其他域对比
l HttpServletRequest:一个请求创建一个request对象,所以在同一个请求中可以共享request,例如一个请求从AServlet转发到BServlet,那么AServlet和BServlet可以共享request域中的数据;
l ServletContext:一个应用只创建一个ServletContext对象,所以在ServletContext中的数据可以在整个应用中共享,只要不启动服务器,那么ServletContext中的数据就可以共享;
l HttpSession:一个会话创建一个HttpSession对象,同一会话中的多个请求中可以共享session中的数据;
4.session的域方法
void setAttribute(String name, Object value) 用来存储一个对象,注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同。
Object getAttribute(String name)):用来获取session中的数据。
5.session的实现原理
当这次会话需要跟踪时(如想要这次会话中的所有请求都共享数据),服务器端创建session,session是保存在服务器端,而给客户端session的id(一个cookie中保存了sessionId)。客户端带走的是包含sessionId的cookie,而数据是保存在session中。
只要不关闭浏览器,包含sessionId的cookie会一直保存到浏览中,即这次会话中的所有访问该服务器的请求头中都会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session。
服务器是银行,浏览器是客户,sessionId是银行卡,session是在银行的钱。客户首次开户,服务器会在系统给客户留一个存钱的位置session,和一张银行卡sessionId-cookie,客户再以后每次取钱拿数据,只需要银行卡sessionId识别身份。
因为cookie默认生命周期是关闭浏览器就消失,所以sessionId只在关闭浏览器前有效。下次会话(重新打开浏览器),请求中没有sessionId,服务器会再创建一个session,重新给浏览器一个sessionId。
session也有失效时间,如果session在30分钟内没人访问,就会自动消失。所以如果在30分钟不访问服务器,即使即不关闭浏览器,请求头中有包含sessionId的cookie,sessionId对应的session也消失了。