浅谈Session技术

引入

因为Cookie有局限性,比如只能存非中文,容量限制等.详情可以看我的上一篇文章浅谈Cookie技术.

但是在某些情况下,需要保存的会话数据内容会超过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).

  1. 创建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);
    
  2. 先使用浏览器1.1访问SessionDemo1,将数据存入Session.再使用浏览器1.1访问SessionDemo2, 数据可以正常取出,使用浏览器1创建新标签后直接访问SessionDemo1也可取出SessionDemo1存入的数据

  3. 新打开一个浏览器1.2,则无法取出浏览器1.1存入的Session数据

  4. 使用浏览器2,直接访问SessionDemo2,无法取出存入的数据

问题: 服务器能够识别不同的浏览者么? 为何会出现这样的情况

Session工作流程分析
HttpSession session = request.getSession();  // 这句代码执行了一下动作
  1. 第一次访问,创建Session对象,为Session对象分配一个唯一的ID,(JSESSIONID)
  2. 把JSESSIONID作为Cookie的值发送给浏览器保存
  3. 第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器
  4. 服务器得到JSESSIONID,在服务器内存中查找搜索是否存放对应的session对象
  5. 如果找到对应ID编号的Session对象,返回该对象,
  6. 如果找不到对应编号的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的有效时间 (单位: 秒)
  1. 默认情况下30分钟服务器自动回收,时间是从不在访问Session对象开始计算的.
  2. 也可以在web.xml文件的跟标签下进行修改,通过web.xml文件修改后,会对所有新创建的Session对象生效(单位:分钟)


    浅谈Session技术_第1张图片
    通过web.xml文件修改Session的有效时间

销毁Session对象

void invalidate(); // 手动销毁Session对象

**避免浏览器的JSESSIONID的Cookie随着浏览器关闭而丢失的问题

Cookie coolie = new Coolie("JSESSION",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);

你可能感兴趣的:(浅谈Session技术)