1. 介绍
- 基于服务器内存的缓存(非持久化),可保存请求会话
- 每个session通过sessionid来区分不同请求
- 键值对形式存在的
- 设置过期时间
2. api
- HttpSession session = request.getSession();
- session.setAttribute(String name,Object obj);
- session.getAttribute(String name);
- session.removeAttribute(String name);
- getCreationTime() session的创建时间
- getLastAccessedTime() 取得session的最后一次操作时间
- isNew() 判断是否取得新的session(新用户)
3. webXML设置过期时间
session过期/失效(默认30分钟)
<session-config>
<session-timeout>30</session-timeout>
</session-config>
4. 生命周期
4.1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
默认情况下。不是。
如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);response.addCookie(c);
4.2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作
session的钝化:在服务器正常关闭之前,将session对象系列化到硬盘上
session的活化:在服务器启动后,将session文件转化为内存中的session对象即可。
4.3. session什么时候被销毁?
- 服务器关闭
- session对象调用invalidate()
5. 如果浏览器禁用Cookie,session还能用吗
不能,但又其他的解决方案
服务器在默认情况下,会使用Cookie的方式将sessionID发送给浏览器,如果用户禁止
Cookie,则sessionID不会被浏览器保存,此时,服务器可以使用如URL重写这样的方来发送sessionID.
使用Session区分每个用户的方式:
1、作为Cookie
2、作为隐藏域嵌入HTML表单中,附加在主体的URL中,通常作为指向其他应用程序页面的链接,即URL重写。
3、更加高效的方法:会话跟踪(Session)
浏览器在访问服务器上的某个地址时,不再使用原来的那个地址,而是使用经过改写的地址
(即,在原来的地址后面加上了sessionID)
如果是链接地址和表单提交,使用response.encodeURL(String url)生成重写后的URL
如果是重定向,使用response.encodeRedirectURL(String url)生成重写的URL
6. session Cookie区别
cookie | session | |
存放 | 客户脚览器或硬盘 | 服务端 |
Cookie只能保存key-va1ue直并且都是string | 可以保存任何类型 | |
客户端是否可洱作 | 可以在浏览器的html端通过js访问 | 不能操作 |
服务端是否操作 | 可以操作 | 可以操作 |
创建方式 | Cookie(String name, String value) | req.getSession() |
存放的数量 | 一般项目最多20个 | 对单个客户来说只有 一个共享的session |
缺点 | 客户端禁用了 cookig,客户端不安全 | 占用服务器的资源,session中要少数据 |