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


       一、会话技术

      问题引入:在一个商城系统中,要想实现用户未登录状态下,将商品保存到购物车中,因为用户没有登录,于是不能讲购物车数据保存到数据库中,因此就可以使用会话技术将数据保存下来。会话技术分为两种:存储在服务器上的技术——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);

      }

      }

      }

  • 相关阅读:
    音乐情感识别
    SoftmaxWithLoss函数和师兄给的loss有哪些区别呢
    内积层和全连接层是一样的
    caffe中的Local Response Normalization (LRN)有什么用,和激活函数区别
    caffe官网的部分翻译及NG的教程
    couldn't import dot_parser
    apt-get -f install
    Spring常用注解总结 hibernate注解
    Set Map List Iterator
    iframe 与frameset
  • 原文地址:https://www.cnblogs.com/CQqf/p/10823633.html
Copyright © 2020-2023  润新知