zoukankan      html  css  js  c++  java
  • 初识Cookie

    题外话

    之前一直以为cookie很神秘,了解的程度也是刚刚入门级别,甚至是说堪堪入门而已,这次为什么写这篇笔记,这得幸于公司项目,在看了登录部分代码之后。所以想趁此机会好好系统性的了解一下cookie,下面是我对于cookie的理解和描述,以及使用方式,最后讲解Cookie类中的方法使用。

    1、对cookie的理解

    • 什么是cookie?
    • cookie是怎么产生的?
    • cookie的作用是什么?

    什么是cookie?

    cookie是服务端校验客户端的凭证。既然cookie是服务端校验客户端的凭证,那么服务器是以什么规范校验的呢?总不可能是客户端提供一个莫名其妙的文本给服务端校验吧?(看第二个问题)

    cookie是怎么产生的?

    cookie是由服务端产生的,然后响应给客户端的一个类似“键值对”的数据。对,没错,cookie是由服务端产生的,然后相应给客户端的一段文本数据,下次客户端要访问服务端需要携带此cookie。既然客户端要携带这个cookie,可是在我们自己编写的代码中,并没有携带类似cookie之类的东西,这是为什么呢?因为cookie的携带是由浏览器自身来完成的,以及服务端响应给客户端的cookie信息也是有浏览器自身来完成的。

    cookie的作用是什么?

    其实在第一个问题里已经说明了,cookie就是服务端校验客户端凭证的一段文本数据。

    2、cookie的使用方式

    • 服务端如何生成cookie?
    • 服务端如何把生成的cookie响应给客户端?
    • 服务端如何获取客户端请求中的cookie?

    服务端如何产生cookie?

    Cookie cookie = new Cookie(cookieName,cookieValue);

    呐,如上,服务端就很轻松简单的创建了一个cookie了。

    服务端如何把生成的cookie响应给客户端?

    HttpServeltResponse response;
    reponse.addCookie(cookie);

    服务端通过HttpServletResponse的addCookie方法,将cookie添加进HttpServletResponse响应给客户端。

    服务端如何获取客户端请求中的cookie?

    HttpServletRequest request;request.getCookies(); // 获取请求中的所有cookie值返回的是一个cookie数组上面的代码是返回一个cookie[],那么如何获取到已知名称的cookie呢?
    
    举一个我用的方法:
    
    // 将获取到的cookie数组转成以cookie名为key的Map类型,value存的是cookie
    public HashMap<String,Cookie> getMapCookie(HttpServletRequest request){
    	Cookie[] cookies = request.getCookies();
    	HashMap<String,Cookie> map = new HashMap<>();
    	if ( cookies != null ){
    		for(cookie cookie : cookies){
    			map.put(cooke.getName,cookie);
    			}
    		}
    	return map;
    }
    
    // 获取指定name的cookie
    HashMap<String,Cookie> cookieMap = getMapCookie(request);
    
    // 对得到的cookieMap判断一下是否存在这个指定名的cookie
    if(cookieMap.containsKey("指定的cookieName"){
    	Cookie cookie = cookieMap.get("指定的cookieName");
    }

    3、Cookie类里的东西

    首先看一下这个类里的一些属性如图,我们可以清晰明了的看见该类的成员变量有好多,我这里只说下我画出来的四个,也是我常用的,其他几个不做记录。

    • name
    • value
    • maxAge
    • path

    name

    该属性是cookie的名字,上面说了,cookie是类似“键值对”的形式,这里的name也相当于键值对中的“key”。

    value

    该属性是cookie的值。

    maxAge

    这个讲实话是真的蛮重要的,看上面那张图,默认是-1,还有该值的类型是int。整型,那么有整数,负数,0三种可能。maxAge指的是cookie的存活时间没错,接下来确实是要分三种情况来讲:

    1. maxAge > 0

      当maxAge > 0的时候,那么该cookie的存活时间就是maxAge s(秒);过了maxAge秒就失效了。在这maxAge秒里,不管是关闭服务端、系统关机、关闭浏览器,cookie一直是存在于客户端的。唯有,只有,仅有 过了这maxAge s 该cookie才"死亡"。该cookie也被称为持久cookie,该cookie会由浏览器保存到磁盘文件上,过期之后再消除。 不同的浏览器保存的cookie文件也是不同的,可以百度了解下。

    2. maxAge = 0

      当maxAge = 0的时候,那么该cookie设置的时候就已经“死亡”了。

    3. maxAge < 0

      当maxAge < 0的时候,那么该cookie的存活时间是当前会话,什么是当前会话?我的理解是关闭浏览器之前 访问系统应用的所有请求,就属于一次会话。(网上好多种说法是关闭当前浏览器的tab标签,可是我试了下,关闭当前tab标签,打开一个新的标签页访问服务端,该cookie还是存在的)总之,要想让这种生命周期的cookie失效,可以关闭浏览器,关闭系统以及关闭服务端。该cookie是会话cookie,cookie数据是保存在内存中的。

    path

    cookie在这个服务端所在的系统哪几个路径下可以访问的到

    比如说:cookie.setPath("/");如果该路径是这样设置的,那么在整个服务端的系统里,所有的路径下都能看的到该cookie值再比如说:cookie.setPath("/51/"); // 需要注意的是最后一个一定要是 /如果cookie设置的path是这样的,那么,只有在 http://xxx/51/... 路径下的服务才能看见该cookie的信息。当然还有一种是压根不设这个路径,那默认的path就是设置该cookie的接口所处的controller层类的@RequestMapping指向好吧,这句话有点绕,我举个例子:客户端结果显示:

    4、cookie的跨域问题

    cookie不能跨域,什么是跨域,比如说,我一个地址映射了两个域名,在1号域名里我已经登录了该系统,假设系统返给客户端cookie信息了,那么你在同一个浏览器去访问2号域名,那么是获取不到刚刚那个cookie信息的。这个可以很方便的在本地上测试。只要将本地的hosts文件修改下,让一个127.0.0.1映射两个模拟域名。


    pic-1590650756174.png

    5、如何在客户端查看当前页面的cookie

    1. 直接在控制台的application这个tab里查看
    2. 在控制台的console这个tab里敲document.cookie;


    pic-1589434627748.png

    6、不能删除、修改

    cookie的操作里是没有删除cookie和修改cookie的,删除的话可以用setAge(0)来实现。而修改的话,创建一个name相同,并且path和domain也相同的cookie进行覆盖。

    7、附上我最近看过最好的一篇写cookie的博客文章

    博客前半部分是优秀的cookie讲解(好吧,请忽略它的排版问题。。。)

  • 相关阅读:
    JAVA中的super和this关键字的使用
    JAVA中类以及成员变量和成员方法的修饰符的总结
    JAVA中的抽象类和接口
    JAVA对数据库进行操作,实现数据库中数据的插入,查询,更改,删除操作
    完整日期正则表达式
    2017实习【Java研发】面经
    MySQL事务及隔离级别(读书小结)
    Java类编译、加载、和执行机制
    JVM内存回收机制
    Centos6.5的MySQL5.7.15二进制源码单机版安装
  • 原文地址:https://www.cnblogs.com/xm970829/p/12981194.html
Copyright © 2011-2022 走看看