获取Session:
HttpSession session=req.getSession();
Session 的实现原理:
- 打开浏览器,在浏览器上发送首次请求
- 服务器会创建一个HttpSession对象,代表着一次对话
- 同时会生成HTTPSession对象所对应的Cookie,且Cookie对象的name为JESSIONID,cookie的value是长度为32位的字符串
- 服务器会将cookie的value和HttpSession对象捆绑到Session列表中
- 服务器将完整的Cookie发送到客户端中
- 浏览器将cookie保存到缓存中
- 只要浏览器不关闭,cookie就不会消失
- 当再次发送请求的时候会自动提取缓存文件中的Cookie
- 服务器接收浏览器发送的Cookie,验证该cookie的name确实是JESSIONID,然后获取Cookie的Value值
- 通过Cookie的value值去session列表中检索对应的HttpSession对象
浏览器禁用Cookie会出现什么情况?
- 浏览器禁用Cookie,则浏览器无法缓存Cookie
- 导致在同一个会话中,无法获取相对应的会话对象
- 禁用Cookie之后,每一次获取会话对象都是新的
浏览器关闭之后,服务器对应的Session会不会被销毁?
-浏览器关闭之后,服务器不会销毁Session对象、
-因为B/S架构的系统是基于HTPP协议,二HTTP协议是一种无连接/无状态的协议
- 什么是无连接/无状态
*请求的瞬间浏览器和服务器之间的通道时打开的,请求相应结束后,通道关闭
*这样做的目的是为了降低服务器的压力
Session什么时候被销毁?
- web系统中引入Session超时概念
- 当很长一段时间(可配置)用户没在在访问Session对象,此时Session对象超时,session会被自动回收
- 配置方法:
120//两个小时
Session中常用的方法:
- void setAttribute(String name ,Object value) (存)
- Object getAttribute(String name) (取)
- void removeAttribute(String name)
- void invariant() (销毁Session)
ServletContext、HttpSession、HttpServletRequest接口的对比:
*都是范围对象
ServletContext application 是应用范围
HttpSession session 是会话范围
HTTP Servlet Request 是请求范围
*范围排序:
application > session > Request
*
application完成跨绘画共享数据
session完成跨请求共享数据,但是这些请求必须在同一个会话中
request完成跨Servlet共享数据,但是这些Servlet必须同在同一个请求中【转发】
*使用原则
由小到大尝试,优先使用小范围
例如:登陆成功之后,已经登陆的状态需要保存起来,可以将登陆成功的状态保存到Session中。
登陆成功的状态不能保存到Request范围中,因为每一次请求对应一个新的request对象。
登陆成功状态不能保存到application范围中,因为登陆成功的状态是会话级别,用户不能共享
方法:
HttpSession session=request.getSession(); //获取当前的session,如果不存在,则新建Session
HttpSession session=request.getSession(boolean create);//其下有两个方法
HttpSession session=request.getSession(true);获取当前的session,如果不存在,则新建Session
//退出登录使用:
HttpSession session=request.getSession(false);获取当前的session,如果不存在,则返回null
退出登录的方法:
HttpSession session=request.getSession(false);
if( session != null){
//销毁Session
session.invalidate();
}