当前位置: 首页 > news >正文

前端关于cookie那些事儿

关于cookie的作用范围,跨域的问题

主域名不同的cookie是不能数据共享的,但一级域名相同,子域名不同的却可以。
比如 csdn.net 和 blog.csdn.net 和 dengxi.csdn.net 这三种domain的cookie在dengxi.csdn.net这个网站都能拿到。

HTTPOnly属性用来保护cookie

使其不能通过document.cookie读取,一些浏览器可以阻止客户端脚本对Cookie的读操作,但允许写操作。

Secure属性只在https协议下生效,防止在传输过程中,cookie被覆盖或者篡改

浏览器禁止在cookie中设置顶级域名

比如.net 或者.com这种,别耍小聪明,想跨站点访问。

每个域不超过50个cookie,每个cookie最多4 KB
结合cookie的作用范围,如果有超过50个cookie,我们可以分成很多个子域进行储存.但还是尽可能减少cookie的使用,和cookie类似的,我们还可以通过localstorage来达到目的.

获取cookie
前端js通过document.cookie来得到所有网站能拿到的相关的cookie内容是一大串字符串

我们封装一个方法,通过cookie的key,来获取对应的值

 function getCookie(key: string) {
 	// key必须传
    if (key === null) return null;
    if (
      // 判断是不是字符串
      Object.prototype.toString.call(key) == "[object String]"
    ) {
      var arrStr = document.cookie.split(";");
      for (var i = 0; i < arrStr.length; i++) {
        var temp = arrStr[i].split("=");
        // 获取到的key值总是有空格,用trim删掉,对应的value值,我们需要用decodeURIComponent解码后取出
        if (temp[0].trim() == key) return decodeURIComponent(temp[1]);
      }
      return null;
    }
    return null;
  }

我们也可以封装一个方法来保存新的cookie值

  function setCookie(name, value, opts) {
    //opts maxAge, path, domain, secure, seconds 
    if (name && value) {
      var cookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);
      //可选参数
      if (opts) {
        if (opts.maxAge) {
          cookie += "; max-age=" + opts.maxAge;
        } else if(opts.seconds) {
            var expires = new Date();
            expires.setTime(expires.getTime() + opts.seconds * 1000);
            cookie += "; expires=" + expires.toGMTString()
        }

        if (opts.path) {
          cookie += "; path=" + opts.path;
        }

        if (opts.domain) {
          cookie += "; domain=" + opts.domain;
        }

        if (opts.secure) {
          cookie += "; secure";
        }
      }

      document.cookie = cookie;

      return cookie;
    } else {
      return "";
    }
  }

相关文章:

  • git——仓库合并不丢失git记录
  • 【云原生】MySQL on k8s 环境部署
  • Jetpack ViewModel源码分析
  • 数字逻辑第二章笔记
  • 从开发角度看羊了个羊
  • 我用PaddleOCR把Halcon论坛的OCR帖子试了一遍,结果。。。
  • 微信号怎么改
  • Spring集成Apache Kafka教程
  • 基于SSM实现图书馆座位预约系统
  • java部分排序算法
  • Java8-特性
  • Mybatis-Plus快速入门|比Mybatis更简单好用的ORM框架
  • Java异常的捕获和处理
  • 若依一体式改包名
  • 【机器学习kaggle赛事】泰坦尼克号生存预测
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • Bytom交易说明(账户管理模式)
  • idea + plantuml 画流程图
  • Javascript Math对象和Date对象常用方法详解
  • java第三方包学习之lombok
  • js 实现textarea输入字数提示
  • leetcode-27. Remove Element
  • markdown编辑器简评
  • opencv python Meanshift 和 Camshift
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • yii2中session跨域名的问题
  • 大快搜索数据爬虫技术实例安装教学篇
  • 马上搞懂 GeoJSON
  • 如何解决微信端直接跳WAP端
  • 在electron中实现跨域请求,无需更改服务器端设置
  • #前后端分离# 头条发布系统
  • (floyd+补集) poj 3275
  • (java)关于Thread的挂起和恢复
  • (WSI分类)WSI分类文献小综述 2024
  • (转)创业的注意事项
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET 8.0 发布到 IIS
  • .NET Core WebAPI中封装Swagger配置
  • .net 按比例显示图片的缩略图
  • .Net 知识杂记
  • .Net程序帮助文档制作
  • .NET文档生成工具ADB使用图文教程
  • @开发者,一文搞懂什么是 C# 计时器!
  • [20171101]rman to destination.txt
  • [Android]创建TabBar
  • [CareerCup] 6.1 Find Heavy Bottle 寻找重瓶子
  • [CDOJ 1343] 卿学姐失恋了
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽
  • [docker]docker网络-直接路由模式
  • [Docker]四.Docker部署nodejs项目,部署Mysql,部署Redis,部署Mongodb
  • [HTML]HTML5实现可编辑表格
  • [Java、Android面试]_05_内存泄漏和内存溢出
  • [linux time命令学习篇] time 统计命令执行的时间
  • [nginx] 网上最全面nginx教程(近100篇文章整理)