千锋教育-做有情怀、有良心、有品质的IT职业教育机构

400-811-9990
当前位置:首页 > 关于学院 > 技术论坛  >  正文

Java基础学习之快速掌握Session和cookie

时间:2018年03月20日 13:49:52     来源:千锋教育 作者:千锋

   一、会话技术

  问题引入:在一个商城系统中,要想实现用户未登录状态下,将商品保存到购物车中,因为用户没有登录,于是不能讲购物车数据保存到数据库中,因此就可以使用会话技术将数据保存下来。会话技术分为两种:存储在服务器上的技术——session技术和存储在客户端的技术——cookie技术。这两种技术都称为会话技术。

  1.会话的概念

  所谓的会话,指的客户端与一个web应用进行交互的过程,

  会话的开始是当客户端打开浏览器与该web应用进行交互,即表示会话开始,

  会话的结束时当客户端关闭浏览器即表示会话的结束。

  2.相应的技术点

  一个会话过程中需要存储数据,那么数据要么存在客户端,要么存在服务器,因此与客户端相应的技术就是Cookie,与服务端相应的技术就是Session

  二、会话技术之Cookie技术

  1.主要解决两个问题:

  解决第一个问题:如何把数据存储到Cookie中并发送给客户端

  //1.创建Cookie对象,向Cookie对象中存入数据

  Cookie cookie = new Cookie("name","dongdong");

  //2.把Cookie发送给客户端

  response.addCookie(cookie);

  解决第二个问题:如何获得客户端携带的Cookie并获得Cookie中的数据。

  //1.通过request对象获得客户端携带过来的所有的Cookie,注意,客户端会自动携带Cookie过来(视情况而定)

  Cookie[] cookies = request.getCookies();

  //2.如果客户端有Cookie则遍历所有的Cookie

  if(cookies!=null){

  for (Cookie cookie : cookies) {

  //3.寻找键是name的Cookie

  if("name".equals(cookie.getName())){

  //4.获得该Cookie的值

  String value = cookie.getValue();

  System.out.println(value);

  }

  }

  }

  2.Cookie相关的API

  1)长期保存Cookie——设置Cookie的存活时间

  Cookie默认情况下是存储在浏览器的缓存中,随着会话的结束,Cookie被销毁。那么如果想长期保存Cookie,就可以通过设置Cookie的存活时间。——setMaxAge(秒值)

  当长期保存Cookie后,Cookie就不再是保存在浏览器的缓存中,而是保存在客户端的本地磁盘中。比如浏览器用于存储Cookie等临时文件的文件夹内。

  2)客户端在访问怎样的资源时会携带Cookie——设置Cookie的路径

  · 默认情况下客户端在访问当前web应用时都会携带由当前web应用产生的Cookie到服务器。

  · 当客户端设置了Cookie的路径,那么在客户端在访问该路径下的任何资源,都能携带Cookie过去。

  cookie.setPath("/")=====http://localhost:8080服务器下的任何资源都会携带该Cookie

  cookie.setPath("/day11")=====day11这个web应用下的任何资源都会携带Cookie,这是Cookie的默认路径

  cookie.setPath("/day11/login")=====day11这个web应用下的login下的任何资源都会携带Cookie

  3)如何删除Cookie: setMaxAge(0) 立即删除,不会再让Cookie存在在浏览器缓存中。

  · 删除不长期保存的Cookie

  //覆盖Cookie的键值对(要保证被覆盖的Cookie的路径相同),让其成为空

  Cookie cookie = new Cookie("name","");

  //彻底删除Cookie

  cookie.setMaxAge(0);

  · 删除长期保存的Cookie

  注意:相同键的Cookie只能是唯一的,后面的Cookie会覆盖前面相同键的Cookie,前提是这两个的路径相同。

  //创建一个与要删除的Cookie相同键的Cookie用于覆盖,如果要删除的Cookie设了路径,那么这个Cookie也要设成相同路径。

  Cookie cookie = new Cookie("name","");

  //设置该Cookie的存活时间是0,也就意味着删除

  cookie.setMaxAge(0);

  response.addCookie(cookie);

  Cookie存储在客户端中,相同路径下的Cookie键是唯一的。因此要删除Cookie,通过再创建一个Cookie,对这个Cookie设置存活时间为0,然后覆盖掉原Cookie,并且保证这两Cookie的路径相同,因为路径相同才能覆盖。

  3.案例之记录用户上次的登录时间

  //解决response的中文乱码问题

  response.setContentType("text/html;charset=utf-8");

  //1.创建Cookie,往Cookie里面塞入当前时间的键值对

  //yyyy-MM-dd

  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

  String time = sdf.format(new Date());

  Cookie cookie = new Cookie("LastAccessTime", time);

  //2.向客户端发送该Cookie

  response.addCookie(cookie);

  //========================

  //3.获得客户端携带的所有的Cookie

  Cookie[] cookies = request.getCookies();

  //如果Cookie不为空

  if(cookies!=null){

  //遍历Cookies数组

  for (Cookie cookie2 : cookies) {

  //找到键是LastAccessTime的Cookie对象

  if("LastAccessTime".equals(cookie2.getName())){

  //获得该Cookie的值

  String value = cookie2.getValue();

  //非第一次登录:

  response.getWriter().write("您上次登录的时间是:"+value);

  }else{

  //如果没有LastAccessTime这个Cookie,是第一次登录,没有Cookie

  response.getWriter().write("您是第一次登录!");

  }

  }

  }else{

  //如果没有Cookie,是第一次登录,没有Cookie

  response.getWriter().write("您是第一次登录!");

  }

  三、会话技术之Session技术

  1.Session技术的分析

  1.服务器创建好Session空间后会把Session空间的编号封装到Cookie中并发送给客户端,该Cookie的键:JSESSIONID

  2.当客户端再次与web应用会话时,就会带着该Cookie过来,如果需要使用session空间,就会从Cookie中找到JSESSIONID,根据JSESSIONID找到相应的Session空间。

  详见图解

  2.Session技术的实现

  需要通过session解决两个问题:

  · 如何获得session域对象(如何获得服务器为客户端开辟的空间)

  · 如何向session域对象存取值:

  1)和获得Session域对象

  HttpSession session = request.getSession();

  (1)如果服务器没有为该客户端开辟过空间(服务器怎么判断有没有为该对象创建过空间?),那么就为该客户端新开辟一个空间。此时session指向该空间。

  怎么判断的?根据客户端有没有JSESSIONID的Cookie。如果没有根据JSESSIONID的值找到对应的空间或者没有JSESSIONID,那么就新开辟一个空间。

  (2)如果服务器已经为该客户端开辟过空间(怎么判断的?),那么就将已经存在的空间给session对象的引用。

  怎么判断的? 通过客户端携带的Cookie的JSESSIONID的值来寻找服务器上的Session空间。

  2)向session域对象存取值

  //往session中存值

  session.setAttribute("name", "dongdong");

  //从session中取值

  String name = (String) session.getAttribute("name");

  //从session中移除值

  session.removeAttribute("name");

  3.Session的生命周期

  · 创建:第一次执行request.getSession()时创建

  · 销毁:

  ​ 1)在web.xml配置了session的timeout,那么时间一到,session就被销毁,注意从何时开始计时?从与该web应用没有任何会话(操作)时开始计时。

  ​ 2)通过session的invalidate()方法来手动销毁session空间

  ​ 3)服务器非正常关闭时,比如断电。那么这个Session就来不及备份(钝化),那么该session就销毁了。

  4.Session的作用范围

  Session的默认作用范围是在一次会话中,因为Cookie默认情况下是存活在一次会话中。第二次会话时Cookie已被销毁。那么如果在第二次会话时也想访问到之前的Session,让之前的Cookie长期保存。

  5.多次会话中访问同一Session

  因为会话结束,服务器上的Session可以长期保存(默认是30分钟,也可以设置成更长的时间)

  //获得session空间

  HttpSession session = request.getSession();

  //存入键值对

  session.setAttribute("name", "dongdong");

  //得到该Session空间的编号

  String id = session.getId();

  System.out.println(id);

  //人工创建一个Cookie,该Cookie中保存Session空间的编号

  Cookie cookie = new Cookie("JSESSIONID",id);

  //让Cookie长期存活,这样在多次会话中就能通过该Cookie找到之前的那个session空间。

  cookie.setMaxAge(60*60*24*7);

  //把Cookie发送给客户端

  response.addCookie(cookie);

  6.删除多次会话中能够访问到的Session空间

  要么删除长期保存的Cookie,让第二次会话不会携带Cookie过去,

  要么删除服务器上的Session,让第二次会话携带的Cookie找不到相应的Session

  要么两者都删除

  //删除session

  HttpSession session = request.getSession();

  session.invalidate();

  //获得客户端携带的所有Cookie

  Cookie[] cookies = request.getCookies();

  if(cookies!=null){

  //遍历Cookie

  for (Cookie cookie : cookies) {

  //找到键是JSESSIONID的Cookie

  if("JSESSIONID".equals(cookie.getName())){

  //将这个Cookie删除

  cookie.setMaxAge(0);

  response.addCookie(cookie);

  }

  }

  }

  千锋java工程师培训课程的授课模式采用全程面授,讲师成本虽高,但是效果却是显著的,和学员面对面沟通,了解到学员在学习过程中遇到的问题,动态地调整授课方式。及时有效地帮助学员解决疑难问题,提高学员的学习积极性。千锋官网每日更新最java基础知识内容,巩固日常学习中的基础技能。

相关文章

  • 北京天丰利校区(总部):北京市海淀区宝盛北里西区28号天丰利商城4层
    北京沙河校区:北京市昌平区沙阳路18号北京科技职业技术学院广场服务楼2层、南区服务楼2层
    咨询电话:400-186-9990 010-82790226-801
    面授课程:全栈HTML5+培训、UI交互设计培训、PHP培训、JavaEE+云数据培训、大数据开发培训、VR/AR混合现实培训、Python培训、Linux云计算培训、软件测试培训、Android培训、iOS培训、好程序员
  • 深圳西部硅谷校区地址:深圳市宝安区宝安大道5010号深圳西部硅谷A区B座605-619
    深圳大学城校区地址:深圳市南山区留仙大道1201号大学城创客小镇16栋2楼、3楼
    咨询电话:0755-33582485-801(硅谷校区)0755-86660670-801(大学城校区)
    面授课程:全栈HTML5+培训、UI交互设计培训、PHP培训、JavaEE+云数据培训、Android培训、iOS培训
  • 上海校区地址:上海市宝山区同济支路199号智慧七立方3号楼2-4层
    咨询电话:400-627-7899 021-56166283/56166279
    面授课程:全栈HTML5+培训、UI交互设计培训、JavaEE+云数据培训、Android课程培训、iOS课程培训、好程序员
  • 郑州校区地址:郑州市二七区航海中路60号海为科技园C区10层、12层
    咨询电话:0371-55191750 400-186-9990
    面授课程:全栈HTML5+培训、UI交互设计培训、PHP培训、JavaEE+云数据培训、Android课程培训、iOS课程培训
  • 广州校区地址:广州市天河区元岗路310号智汇park创意园E座5层
    咨询电话:020-22119207 400-186-9990
    面授课程:全栈HTML5+培训、JavaEE+云数据培训、Android课程培训、iOS课程培训
  • 大连校区地址:辽宁省大连市甘井子区软件园路2号东软信息学院B5座一楼
    咨询电话:0411-39026086 400-186-9990
    面授课程:全栈HTML5+培训、JavaEE+云数据培训、UI交互设计培训、Android课程培训、iOS课程培训
  • 武汉校区地址:武汉市光谷大道61号智慧园21号楼2层
    咨询电话:027-65523826
    面授课程:全栈HTML5+培训、JavaEE+云数据培训、Android课程培训、iOS课程培训
  • 成都校区地址:成都市武侯区科华北路62号力宝大厦N(北楼)18楼
    咨询电话:028-83178771
    面授课程:全栈HTML5+培训、UI交互设计培训、PHP培训、JavaEE+云数据培训、Android课程培训、iOS课程培训
  • 西安校区地址:西安市雁塔区高新六路52号立人科技C座西区4楼
    咨询电话:029-85260160
    面授课程:全栈HTML5+培训、JavaEE+云数据培训、Android课程培训
  • 杭州校区地址:浙江省杭州市江干区九堡旺田书画城A座4层
    咨询电话:0571-86893632 010-82790226-801
    面授课程:全栈HTML5+培训、JavaEE+云数据培训、Android课程培训、iOS课程培训
  • 青岛校区地址:青岛市市北区龙城路卓越世纪中心3号楼8层
    咨询电话:0532-80911190 010-82790226-801
    面授课程:全栈HTML5+培训、UI交互设计培训、JavaEE+云数据培训、Android课程培训、iOS课程培训
  • 重庆校区地址:重庆市高新区科园一路2号大西洋国际12-1
    咨询电话:023-68883009
    面授课程:JavaEE+云数据课程培训
  • 长沙校区地址:湖南省长沙市岳麓区麓谷企业广场A2栋三单元306号
    咨询电话:400-186-9990
    面授课程:JavaEE+云数据课程培训
  • 哈尔滨校区地址:哈尔滨市松北区创新一路699号科技创新城19号楼五楼
    咨询电话:15663846969
    面授课程:全栈HTML5+培训
  • 千锋教育服务号

    了解千锋动态
    关注千锋教育服务号

  • 千锋教育移动站

    扫一扫快速进入
    千锋移动端页面

  • 千锋互联服务号

    扫码匿名提建议
    直达CEO信箱