声明
文章大部分内容转载自公众号(Java3y),如需转载请关注Java3y公众号联系作者 ;本文已经获得转载声明

 Session 是另一种记录浏览器状态的机制。不同的是Cookie保存在浏览器中,Session保存在服务器中。用户使用浏览器访问服务器的时候,服务器把用户的信息以某种的形式记录在服务器,这就是Session

 如果说Cookie是检查用户身上的”通行证“来确认用户的身份,那么Session就是通过检查服务器上的”客户明细表“来确认用户的身份的。Session相当于在服务器中建立了一份“客户明细表”。

Session可以存储对象,Cookie只能存储字符串
只要Session对象没有被销毁,Servlet之间就可以通过Session对象实现通讯
只要浏览器不关闭,希望数据还在,就使用Session来保存

与cookie的区别

  • session周期指的是不活动的时间,如果在超时时间(默认30分钟)内没有访问session,则session中的属性失效.如果在第29分钟访问session则会重新计时
  • 重启、reload、关机都可以让session失效.使用invalidate()安全退出--所有属性失效
  • 某个session属性失效使用removeAttribute()
  • cookie生命周期是按累计时间算的,到了就会失效

入门方法

  • getId()--获取sessionid
  • setMaxInactiveInterval(int var1)--设置session超时时间
  • getAttribute(String var1)--获取session属性
  • setAttribute(String var1,Object var2)--设置session属性
  • removeAttribute(String var1)--移除session属性
  • invalidate()--销毁该session

Session的生命周期和有效期

  • Session在用户第一次访问服务器Servlet,jsp等动态资源就会被自动创建,Session对象保存在内存里,这也就为什么上面的例子可以直接使用request对象获取得到Session对象
  • 如果访问HTML,IMAGE等静态资源Session不会被创建
  • Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,无论是否对Session进行读写,服务器都会认为Session活跃了一次
  • 由于会有越来越多的用户访问服务器,因此Session也会越来越多。为了防止内存溢出,服务器会把长时间没有活跃的Session从内存中删除,这个时间也就是Session的超时时间
  • Session的超时时间默认是30分钟,修改方法
    • tomcat的web.xml中
      <session-config>
      <session-timeout>20</session-timeout>
      </session-config>   
    • 项目的web.xml中
      <session-config>
      <session-timeout>20</session-timeout>
      </session-config> 
    • 通过setMaxInactiveInterval()方法设置
      //设置session最长超时时间为60秒
      httpSession.setMaxInactiveInterval(60);
      System.out.println(httpSession.getMaxInactiveInterval());

使用session完成的购物车

 先获取Session的属性,如果Session属性为null则为第一次访问(前台显示跟用cookie差不多)

//添加书籍到购物车
    String id = request.getParameter("id");
    Book book = (Book)DB.getAll().get(id);
    HttpSession httpSession = request.getSession();
//用户需要买多本书,使用一个容器装书籍数据
    List list = (List)httpSession.getAttribute("list");
    if(list == null) {
        list = new ArrayList();
//设置session属性
        httpSession.setAttribute("list",list);
    }
    list.add(book);

 购买记录

    HttpSession httpSession = request.getSession();
    List<Book> list = (List)httpSession.getAttribute("list");
    if(list == null || list.size() == 0) {
        printWriter.write("没买过任何商品");
    } else {
        printWriter.write("你买过一下商品:");
        for(Book book:list) {
            printWriter.write(book.getName());
        }
    }

Session的实现

//servlet1
    //得到Session对象
    HttpSession httpSession = request.getSession();
    //设置Session属性
    httpSession.setAttribute("name", "看完博客就要点赞!!");

//servlet2
    String value = (String) request.getSession().getAttribute("name");
    printWriter.write(value);

 服务器为不同的用户浏览器提供不同session

  • HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一个用户。于是乎:服务器向用户浏览器发送了一个名为JESSIONID的Cookie,它的值是Session的id值。其实Session依据Cookie来识别是否是同一个用户--Session 之所以可以识别不同的用户,依靠的就是Cookie
  • 该Cookie是服务器自动颁发给浏览器的,不用我们手工创建的。该Cookie的maxAge值默认是-1,也就是说仅当前浏览器使用,不将该Cookie存在硬盘中
  • 当我们访问Servlet1的时候,服务器就会创建一个Session对象,执行我们的程序代码,并自动颁发个Cookie给用户浏览器,当我们用同一个浏览器访问Servlet2的时候,浏览器会把Cookie的值通过http协议带过去给服务器,服务器就知道用哪个Session。