Cookie总结

作者: ggr | 来源:发表于2018-04-15 13:07 被阅读0次

    生活感悟:一个人总要走陌生的路,看陌生的风景,听陌生的歌,然后在某个不经意的瞬间,你会发现,原本费尽心机想要忘记的事情真的就这么忘记了。

    self.jpg

    1. Cookie是什么?

       会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

       Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Firefox、Google等都支持Cookie。

       由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。

       Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

    2. Cookie的种类有哪些?

      Cookie分为会话cookie和持久cookie。
      会话cookie是指在不设定它的生命周期expires时的状态,前面说了,浏览器的开启到关闭就是一次会话,当关闭浏览器时,会话cookie就会跟随浏览器而销毁。当关闭一个页面时,不影响会话cookie的销毁。会话cookie就像我们没有办理积分卡时,单一的买卖过程,离开之后,信息则销毁。
      持久cookie则是设定了它的生命周期expires,此时,cookie像商品一样,有个保质期,关闭浏览器之后,它不会销毁,直到设定的过期时间。对于持久cookie,可以在同一个浏览器中传递数据,比如,你在打开一个淘宝页面登陆后,你在点开一个商品页面,依然是登录状态,即便你关闭了浏览器,再次开启浏览器,依然会是登录状态。这就是因为cookie自动将数据传送到服务器端,在反馈回来的结果。持久cookie就像是我们办理了一张积分卡,即便离开,信息一直保留,直到时间到期,信息销毁。

    3. Cookie可以干什么?

       Cookie主要用来做存放客户端身份信息的,当然通过加解密也可以把一些不会经常变动的数据放到浏览器的Cookie中。比如:

    1. 常用的记住密码功能:把用户认证的信息通过加密放到客户端,下次认证的时候只需要看一下用户输入加密后是不是和Cookie中的一致就可以了。

    2. 永久登录:通过配合设置Cookie的生存时间可以实现近乎于永久登录的功能。

    方案一:把密码加密后保存到Cookie中,下次访问时解密并与数据库比较。我在早期的一个银行项目后台登录就是用的这种方式。
    方案二:只在登录时查询一次数据库,以后访问验证登录信息时不再查询数据库。实现方式是把账号按照一定的规则加密后,连同账号一块保存到Cookie中。下次访问时只需要判断账号的加密规则是否正确即可。

    1. 记录用户访问次数 通过设置Cookie中自定义key的值,每次访问将cookie里面的值加一,可以用来限制单个用户的访问次数。

    4.Cookie里面的主要内容是什么?

       在浏览器按F12 到console中输入javascript:alert (document. cookie) 然后回车就可以了(需要有网才能查看)。


    image.png

       Cookie的几种常见属性:document.cookie="key=value;expires=失效时间;path=路径;domain=域名;secure;(secure表安全级别)

    表1.1 Cookie常用属性

    属 性 名 描 述
    String name 该Cookie的名称。Cookie一旦创建,名称便不可更改
    Object value 该Cookie的。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码
    int maxAge 该Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1
    boolean secure 该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false
    String path 该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”
    String domain 可以访问该Cookie的域名。如果设置为“www.jianshu.com”,则所有以“www.jianshu.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”
    String comment 该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明
    int version 该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范

    特性:

    Cookie的有效期

    Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。
    如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的 Cookie持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。 下面代码中的Cookie信息将永远有效。
    如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该 Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏 览器内存中,因此关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为–1。
    如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除,response对象提供的Cookie操作方法只有一个添加操作add(Cookie cookie)。要想修改Cookie只能使用一个同名的Cookie来覆盖原来的Cookie,达到修改的目的。删除时只需要把maxAge修改为0即可。
    注意:从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期。

    Cookie的域名

    Cookie是不可跨域名的。域名www.google.com颁发的Cookie不会被提交到域名www.baidu.com去。这是由Cookie的隐私安全机制决定的。隐私安全机制能够禁止网站非法获取其他网站的Cookie。
    正常情况下,同一个一级域名下的两个二级域名如top.guirong.com和 top.guirong.image.com也不能交互使用Cookie,因为二者的域名并不严格相同。如果想所有 guirong.com名下的二级域名都可以使用该Cookie,需要设置Cookie的domain参数,
    例如:
    Cookie cookie = new Cookie("username","xxx"); // 新建Cookie
    cookie.setDomain(".guirong.com"); // 设置域名
    cookie.setPath("/"); // 设置路径
    cookie.setMaxAge(Integer.MAX_VALUE); // 设置有效期
    response.addCookie(cookie); // 输出到客户端
    读者可以修改本机C:\WINDOWS\system32\drivers\etc下的hosts文件来配置多个临时域名,然后使用setCookie.jsp程序来设置跨域名Cookie验证domain属性。
    注意:domain参数必须以点(".")开始。另外,name相同但domain不同的两个Cookie是两个不同的Cookie。如果想要两个域名完全不同的网站共有Cookie,可以生成两个Cookie,domain属性分别为两个域名,输出到客户端。

    Cookie的路径

    domain属性决定运行访问Cookie的域名,而path属性决定允许访问Cookie的路径(ContextPath)。例如,如果只允许/sessionWeb/下的程序使用Cookie,可以这么写:
    Cookie cookie = new Cookie("username","xxx"); // 新建Cookie
    cookie.setPath("/session/"); // 设置路径
    response.addCookie(cookie); // 输出到客户端
    设置为“/”时允许所有路径使用Cookie。path属性需要使用符号“/”结尾。name相同但domain相同的两个Cookie也是两个不同的Cookie。
    注意:页面只能获取它属于的Path的Cookie。例如/session/test/a.jsp不能获取到路径为/session/abc/的Cookie。使用时一定要注意。

    Cookie的安全属性

    HTTP协议不仅是无状态的,而且是不安全的。使用HTTP协议的数据不经过任何加密就直接在网络上传播,有被截获的可 能。使用HTTP协议传输很机密的内容是一种隐患。如果不希望Cookie在HTTP等非安全协议中传输,可以设置Cookie的secure属性为 true。浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。下面的代码设置secure属性为true:
    Cookie cookie = new Cookie("username", "xxx"); // 新建Cookie
    cookie.setSecure(true); // 设置安全属性
    response.addCookie(cookie); // 输出到客户端
    提示:secure属性并不能对Cookie内容加密,因而不能保证绝对的安全性。如果需要高安全性,需要在程序中对Cookie内容加密、解密,以防泄密。


    最后:使用Cookie要注意那些问题?

    Cookie具有不可跨域名性

     根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。

    Cookie的修改、删除问题

      Cookie并不提供修改、删除操作。如果要修改某个Cookie,只需要新建一个同名的Cookie,添加到response中覆盖原来的Cookie。
      如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。注意是0而不是负数。负数代表其他的意义。读者可以通过上例的程序进行验证,设置不同的属性。
      注意:修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。

    是不是要用Cookie的问题

      有些浏览器会禁用Cookie的,所以使用Cookie只是辅助,如果Cookie失效,还是要有正常的验证流程的。
      Cookie一定程度上导致了客户信息的不安全,所以如果必要请将数据加密后再存到Cookie中。没有必要的话就不要把太多数据放到Cookie中,因为Cookie的传输也是一种额外的流量消耗。

    编码问题

      中文与英文字符不同,中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会乱码。
      提示:Cookie中保存中文只能编码。一般使用UTF-8编码即可。不推荐使用GBK等中文编码,因为浏览器不一定支持,而且JavaScript也不支持GBK编码。

    BASE64编码:保存二进制图片

      使用base64可以将图片二进制转化为string,但是由于每次请求都要传输Cookie,所以这里只是说一下它可以存二进制流

    各个浏览器对Cookie的支持不同

    • 1.浏览器允许每个域名所包含的cookie数:
       Microsoft指出InternetExplorer8增加cookie限制为每个域名50个,但IE7似乎也允许每个域名50个cookie。
       Firefox每个域名cookie限制为50个。
       Opera每个域名cookie限制为30个。
       Safari/WebKit貌似没有cookie限制。但是如果cookie很多,则会使header大小超过服务器的处理的限制,会导致错误发生。
       注意:“每个域名cookie限制为20个”将不再正确!

      1. 当很多的cookie被设置,浏览器如何去响应。
        除Safari(可以设置全部cookie,不管数量多少),有两个方法:
         最少最近使用(leastrecentlyused(LRU))的方法:当Cookie已达到限额,自动踢除最老的Cookie,以使给最新的Cookie一些空间。Internet Explorer和Opera使用此方法。
         Firefox很独特:虽然最后的设置的Cookie始终保留,但似乎随机决定哪些cookie被保留。似乎没有任何计划(建议:在Firefox中不要超过Cookie限制)。
      1. 不同浏览器间cookie总大小也不同:
        Firefox和Safari允许cookie多达4097个字节,包括名(name)、值(value)和等号。
        Opera允许cookie多达4096个字节,包括:名(name)、值(value)和等号。
        Internet Explorer允许cookie多达4095个字节,包括:名(name)、值(value)和等号。
        注:多字节字符计算为两个字节。在所有浏览器中,任何cookie大小超过限制都被忽略,且永远不会被设置。

    文章参考:向前辈们致敬!!! * -**
    https://www.cnblogs.com/henryhappier/archive/2011/03/03/1969564.html
    https://blog.csdn.net/u014753892/article/details/52821268
    https://www.cnblogs.com/linguoguo/p/5106618.html

    相关文章

      网友评论

        本文标题:Cookie总结

        本文链接:https://www.haomeiwen.com/subject/jrhdkftx.html