• cookie 在 javascript 中的用法及服务器端设置的隐私 cookie


    读取cookie字符串方法:

    alert(document.cookie); 

    一个网站的cookie字符串包含了该站点域名下的所有cookie(javascript 可访问的,不包括 httponly 的cookie ),多个cookie之间用分号和一个空格隔开,最多一般是 20个或50个,例如,包含2个cookie的字符串格式为

    document.cookie = "key1=value1; key2=value2"

    一个cookie字符串最长为4k,超出个数限制或长度限制时将返回空值, cookie 个数超出限制时,会造成另外一些 cookie 丢失,按规范,丢失的应该是 最近最少使用的,但是浏览器的实现并不完全遵循这个规范。

    设置一个cookie的方法:

    document.cookie="key=value;expires=date;path=/;domain=xxx.com;secure";

    要设置多个cookie 只要反复使用 document.cookie = XXX 即可,会自动和其他cookie拼接成一个cookie字符串。

    如果要读取某个cookie的值,只能通过解析cookie字符串来得到。

    下面是设置cookie时的几个参数

    1、名和值:key 为 cookie名称,value为cookie值

    2、过期时间:expires用于设置过期时间,为格林威治字符串格式,如 

    expires = new Date('2011/12/30').toUTCString(); //"Fri, 30 Dec 2011 00:00:00 GMT"

    如果没有设置过期时间,cookie将在浏览器关闭时失效。

    3、所属路劲:网站某张网页中的脚本所设置的cookie默认情况下只能供该网页所在文件夹及其子文件夹中的网页访问,如 http://www.xxxxx.com/aa/1.html 所设置的cookie 不能被 http://www.xxxxx.com/bb/2.html 访问,更多的时候都希望一个cookie能被本站所有网页访问,这就需要设置path属性, path=/ 表示该cookie的所属路劲是网站根目录,这样本站所有网页都能访问。

    4、所属域名:cookie无法跨域访问,一般情况下,cookie仅供本站使用,如果想在多个网站下共享,那么共享cookie的网站必须拥有同一个主域名,通过设置 domain属性来实现。比如,如果想让 www.aaa.com 和 bbs.aaa.com这两个二级域名下的网站共享cookie,在设置cookie时需要设置domain=.aaa.com(注意前面的点号,有些浏览器省略这个点号仅设置成 domain= aaa.com 不能达到共享cookie的效果),另外要注意, cookie 不遵守同源策略,只按域名区分, 相同域名,不同协议和端口的网站会共享cookie。

    5、加密传输:如果一个cookie带有secure属性,那么cookie在传输到服务器的过程中将使用加密数据的方式传输, 仅用于 https。

    cookie字符串编码:

    cookie字符串中不能包含空格,分号,逗号等特殊符号,如果可能包含这些符号,可以使用encodeURIComponent()函数将 cookie 的值进行编码,读取 cookie 的值时再使用decodeURIComponent()函数把值进行转换回来,如 document.cookie="key="+encodeURIComponent(value);

      

    在服务器设置 cookie 并声明其私密性(secure 及 httponly):

    有时候为安全,你可能需要限制一些 cookie 的访问

    secure : 该 cookie 仅供 https 安全连接使用

    httponly : cookie 仅供 http 传输过程中使用,javascript 不能访问该 cookie

    例如,在PHP 中使用内置函数setcookie() 设置一个具有私密性限制的 cookie

    setcookie("UserIDCookie","123456",time()+60*30,'/','mytest.com',false,true);

    其中第六个参数 表示是否仅供 https 连接使用,第 七个参数 true 表示是否为 httponly

    跨域请求及第三方 cookie ,以及 P3P(个人隐私保护策略):

    浏览器的隐私设置(或者内容设置,chrome 在高级设置--内容设置 选项)中,设置禁止使用第三方 cookie 时,跨域请求(包括 iframe ,img ,javascript 文件等请求)无法发送属于该域的 cookie .

    例如, 通过 iframe 引用一个跨域的 页面 http://www.other.com/index.html ,即使浏览器中保存了属于 other.com 域名下的某个名为 otherLoginFrag 的cookie  ,在 iframe 中请求 该页面时, otherLoginFrag 并不会随请求一起发往 www.other.com 的服务器。

    第三方 cookie 限制在不同的浏览器中可能略有不同,比如, safari 在禁用 第三方 cookie 时,from 表单的提交也只有 post 方式才能提交 cookie .

    如果在希望在浏览器禁用 第三方cookie 时仍能发送跨域请求的 cookie ,就需要在跨域的服务器中使用 P3P 响应头预先声明允许发送的 cookie.

     //php
    header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
    setcookie("UserIDCookie","123456");

      

    更详细的信息可参考:

    http://www.w3.org/P3P/

    http://wenku.baidu.com/view/ff86ad6a1eb91a37f1115ccf.html

    http://blog.163.com/wm_at163/blog/static/132173490201110710533428/

  • 相关阅读:
    使用 Responsive Elements 快速构建响应式网站
    分享25个新鲜出炉的 Photoshop 高级教程
    【特别推荐】Node.js 入门教程和学习资源汇总
    高清精美壁纸:2013年11月桌面日历壁纸免费下载
    Allocation-Free Collections(在堆栈上使用内存)
    李愬雪夜袭蔡州:挽救唐朝国祚的关键之战(先示弱于敌军,对降将攻心为上、以诚待人,然后逐步收集情报,最后出奇兵奇袭。但出奇兵也要有预案,否则会被两面夹击。做一件事情真不容易)
    C 与 C++ 谁的效率高,为什么?(结论是,两个不同层次的语言不应该相互比较,非要比较的话,是不同情况下各有快慢)
    在Win10上,Android Studio检测不到设备的解决方案
    web系统整体优化
    服务器间通讯问题的排查
  • 原文地址:https://www.cnblogs.com/ecalf/p/2799779.html
Copyright © 2020-2023  润新知