引入
但是在某些情况下,需要保存的会话数据内容会超过4KB大小,或者为其他数据类型,就不能使用Cookie技术.因此就诞生了Session技术.
Session核心技术
Session特点
Session技术是将会话的数据保存在服务器端(内存中).
Session核心类
HttpSession类: HttpSession是一个域对象,用于保存会话数据
核心方法
获取Session对象
通过HttpServletRequest对象中的方法获得Session对象
HttpSession getSession();
HttpSession getSession(boolean create);
设置Session对象
void setMaxInactiveInterval(int interval); // 设置Session的有效时间
void invalidate() // 销毁Session对象
String getId(); // 得到Session的编号
为Session设置数据
void setAttribute(String name,Object value); // 保存数据
Object getAttribute(String name); // 通过名字获取数据
void removeAttribute(String name); // 清除数据
Session原理
实验:
实验工具浏览器1(Firefox)、浏览器2(Chrome).
-
创建2个Servlet分别用于将数据存入/取出Session.
// SessionDemo1用于将数据创建Session,并将数据存入Session中 HttpSession session = request.getSession(); session.setAttribute("name", "Se7en"); // SessionDemo2用于取出SessionDemo1存入的数据 HttpSession session = request.getSession(); String name = (String)session.getAttribute("name"); System.out.println(name);
-
先使用浏览器1.1访问SessionDemo1,将数据存入Session.再使用浏览器1.1访问SessionDemo2, 数据可以正常取出,使用浏览器1创建新标签后直接访问SessionDemo1也可取出SessionDemo1存入的数据
-
新打开一个浏览器1.2,则无法取出浏览器1.1存入的Session数据
-
使用浏览器2,直接访问SessionDemo2,无法取出存入的数据
问题: 服务器能够识别不同的浏览者么? 为何会出现这样的情况
Session工作流程分析
HttpSession session = request.getSession(); // 这句代码执行了一下动作
- 第一次访问,创建Session对象,为Session对象分配一个唯一的ID,(JSESSIONID)
- 把JSESSIONID作为Cookie的值发送给浏览器保存
- 第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器
- 服务器得到JSESSIONID,在服务器内存中查找搜索是否存放对应的session对象
- 如果找到对应ID编号的Session对象,返回该对象,
- 如果找不到对应编号的Session对象,创建新的Session独享,继续走流程1
Session细节
获得一个Session对象
HttpSession getSession();
HttpSession getSession(boolean create);
- 无参数 : 获取一个Session对象,判断是否有JSESSIONID传入,如果有通过ID找到对应对象并返回,如果浏览器没有传入JSESSION.则返回新创建的Session对象,并将新生成的JSESSIONID通过response返回给浏览器保存
- 有参数:
- true: 如果填true,效果和无参数效果相同
- false: 查找是否有JSESSIONID传入,如果有找到对应的Session对象并返回.如果没有直接返回null.
获取Session对象的Id
String getId(); // 获取Session对象对应的"JSESSIONID"值
Session有效时间
void setMaxInactiveInterval(int interval); // 设置Session的有效时间 (单位: 秒)
- 默认情况下30分钟服务器自动回收,时间是从不在访问Session对象开始计算的.
-
也可以在web.xml文件的跟标签下进行修改,通过web.xml文件修改后,会对所有新创建的Session对象生效(单位:分钟)
通过web.xml文件修改Session的有效时间
销毁Session对象
void invalidate(); // 手动销毁Session对象
**避免浏览器的JSESSIONID的Cookie随着浏览器关闭而丢失的问题
Cookie coolie = new Coolie("JSESSION",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);