cookie(储存在用户本地终端上的数据)

cookie(储存在用户本地终端上的数据)

会话

会话 :用户打开一个浏览器,点开了许多超链接,访问多个web资源,当关闭浏览器时,这个过程称之为会话
有状态会话:一个同学曾经来过教室,下次来,我们知道这个人曾经来过,称之为有状态会话

保存会话的技术

一,cookie
① 客户端技术 (响应 ,请求)
二,session
② 服务器技术,利用这个技术,可以保存用户的会话信息?我们可以吧信息或者数据放入session中!
常见例子:我们登录B站,我们在第一次进入网站的时候,网站会记录你的的登录信息,下次访问该网站,服务器直接匹配你的信息即可直接登录

cookie的由来;

HTTP是一种无状态的协议,不会保存客户端和服务端之间的通信状态进行保存。最初cookie的由来是需要保存在web中的状态信息,方便服务器端的使用。目前所有主流浏览器(360,IE,谷歌等等)都支持cookie。

Cookie的主要构成如下:

name: 一个唯一确定的cookie名称。通常来讲cookie的名称是不区分大小写的。
value: 存储在cookie中的字符串值。最好为cookie的name和value进行url编码。
domain: cookie对于哪个域是有效的。所有向该域发送的请求中都会包含这个cookie信息。这个值可以包含子域,也可以不包含它。
path: 表示这个cookie影响到的路径,浏览器跟会根据这项配置,像指定域中匹配的路径发送cookie。
expires: 失效时间,表示cookie何时应该被删除的时间戳(也就是,何时应该停止向服务器发送这个cookie)。如果不设置这个时间戳,浏览器会在页面关闭时即将删除所有cookie;不过也可以自己设置删除时间。这个值是GMT时间格式,如果客户端和服务器端时间不一致,使用expires就会存在偏差。
max-age: 与expires作用相同,用来告诉浏览器此cookie多久过期(单位是秒),而不是一个固定的时间点。正常情况下,max-age的优先级高于expires。
HttpOnly: 告知浏览器不允许通过脚本document.cookie去更改这个值,同样这个值在document.cookie中也不可见。但在http请求张仍然会携带这个cookie。注意这个值虽然在脚本中不可获取,但仍然在浏览器安装目录中以文件形式存在。这项设置通常在服务器端设置。
secure: 安全标志,指定后,只有在使用SSL链接时候才能发送到服务器,如果是http链接则不会传递该信息。就算设置了secure 属性也并不代表他人不能看到你机器本地保存的 cookie 信息,所以不要把重要信息放cookie就对了服务器端设置

cookie的工作原理

由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份(服务器端会先给客户端发个信件(cookie对象),每个客户端都有一个,无论谁访问网站都必须带上这个信件,这样才能确认你的信息,这就是cookie的工作原理)
1,从请求中拿到cookie
2,服务器响应给客户端cookie
cookie(储存在用户本地终端上的数据)_第1张图片

设置cookie的有效期

Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。

//cookie的有效期为一天
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);

Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除:

//设置cookie生命周期为0 ,即可实现删除效果
cookie.setMaxAge(0);
resp.addCookie(cookie);

编码,解码
在这里插入图片描述

一个网站的cookie的上限问题!细节问题

  • 一个Cookie只能保存一个信息
  • 一个web站点可以给浏览器发下发送多个Cookie,最多存放20个
  • Cookie的大小限制为40kb
  • 300个cookie浏览器上限

Cookie的安全属性

HTTP协议不仅是无状态的,而且是不安全的。使用HTTP协议的数据不经过任何加密就直接在网络上传播,有被截获的可能。使用HTTP协议传输很机密的内容是一种隐患。

案列

这里我们可以利用cookie记录我们登录该网站的时间

 //服务器告诉你  你来的时间,把来的时间封装成一个信件,你下次来的时候把信件上,服务器就知道你来了

        //解决中文乱码的问题
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");

        PrintWriter out = resp.getWriter();

        //Cookie,服务器从客户端获取
        Cookie[] cookies = req.getCookies();//这里返回的是数组,则是表明cookie可能是多个

        //判断Cookie是否存在
        if(cookies!=null){
              //如果存在
            out.write("你上次访问的时间:");
            for(int i=0;i<cookies.length;i++){
                Cookie cookie = cookies[i];
                //获取cookie的名称
                if(cookie.getName().equals("lastLoginTime")){
                    //获取cookie中值
                    Long lastLoginTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastLoginTime);
                    out.write(date.toLocaleString());

                }
            }
        }else{
         out.write("你是第一次访问:");
        }

        //给客户端传送相应一个Cookie,
        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
        //cookie的有效期为一天
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);
 

我们可以在网站里面查看我们的cookie,但是当我们关闭浏览器的时候cookie依然存在
cookie(储存在用户本地终端上的数据)_第2张图片

你可能感兴趣的:(cookie(储存在用户本地终端上的数据))