JavaScript 获取二级域名的方法

本文涉及的产品
.cn 域名,1个 12个月
简介: JavaScript 获取二级域名的方法

正文


背景


有个需求,将 cookie 设置到我们的二级域名上,在不同的项目都可以公用。


准备


  1. 一个完整的域名由二个或二个以上部分组成,各部分之间用英文的句号 . 来分隔;
  2. 在设置 cookie 时,如省略 domain 参数,那么它默认设置为当前域名;
  3. domain 参数可以设置父域名以及当前域名。不能设置为其他域名,包括子域名也不行;
  4. cookie 的作用域是 domain 本身以及 domain 下的所有子域名。(这里忽略 path 参数限制,当做 /)


思路


如何获取二级域名,以 shortcuts.sspai.com 为例:

接着我们对 URL 进行拆分,按先后顺序对 comsspai.comshortcuts.sspai.com (以此类推)设置 cookie。倘若能设置 cookie 则说明域名是合法的,此时停止继续往下执行,直接返回结果 sspai.com,同时删掉该 cookie。


其他


  1. 需要注意的是,baidu.com 应属于二级域名。
  2. 关于顶级域名、二级域名、三级域名等划分如理解有偏差,自行搜索。可参考
  3. 当前采用部分 ES6 语法,若需兼容 ES5 自行修改即可。
  4. 还有一些比较实用的 JS 方法,比如中文转拼音、身份证号码校验等。


实现


/**
 * 获取当前 URL 二级域名
 * 如果当前是 IP 地址,则直接返回 IP Address
 */
function getSubdomain() {
  try {
    let subdomain = ''
    const key = `mh_${Math.random()}`
    const expiredDate = new Date(0)
    const { domain } = document
    const domainList = domain.split('.')
    const reg = new RegExp(`(^|;)\\s*${key}=12345`)
    const ipAddressReg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
    // 若为 IP 地址、localhost,则直接返回
    if (ipAddressReg.test(domain) || domain === 'localhost') {
      return domain
    }
    const urlItems = []
    urlItems.unshift(domainList.pop())
    while (domainList.length) {
      urlItems.unshift(domainList.pop())
      subdomain = urlItems.join('.')
      const cookie = `${key}=12345;domain=.${subdomain}`
      document.cookie = cookie
      if (reg.test(document.cookie)) {
        document.cookie = `${cookie};expires=${expiredDate}`
        break
      }
    }
    return subdomain || document.domain
  } catch (e) {
    return document.domain
  }
}


参考


目录
相关文章
|
1月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
1月前
|
Web App开发 JavaScript 前端开发
如何确保 Math 对象的方法在不同的 JavaScript 环境中具有一致的精度?
【10月更文挑战第29天】通过遵循标准和最佳实践、采用固定精度计算、进行全面的测试与验证、避免隐式类型转换以及持续关注和更新等方法,可以在很大程度上确保Math对象的方法在不同的JavaScript环境中具有一致的精度,从而提高代码的可靠性和可移植性。
|
2月前
|
缓存 监控 前端开发
JavaScript 实现大文件上传的方法
【10月更文挑战第17天】通过以上步骤和方法,我们可以实现较为可靠和高效的大文件上传功能。当然,具体的实现方式还需要根据实际的应用场景和服务器要求进行调整和优化。
|
1月前
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
130 52
|
1月前
|
JavaScript 前端开发 索引
js中DOM的基础方法
【10月更文挑战第31天】这些DOM基础方法是操作网页文档结构和实现交互效果的重要工具,通过它们可以动态地改变页面的内容、样式和行为,为用户提供丰富的交互体验。
|
1月前
|
缓存 JavaScript UED
js中BOM中的方法
【10月更文挑战第31天】
|
1月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
47 5
|
1月前
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
27 1
|
1月前
|
JavaScript 前端开发
.js方法参数argument
【10月更文挑战第26天】`arguments` 对象为JavaScript函数提供了一种灵活处理参数的方式,能够满足各种不同的参数传递和处理需求,在实际开发中具有广泛的应用价值。
45 7
|
1月前
|
JavaScript 前端开发 图形学
JavaScript 中 Math 对象常用方法
【10月更文挑战第29天】JavaScript中的Math对象提供了丰富多样的数学方法,涵盖了基本数学运算、幂运算、开方、随机数生成、极值获取以及三角函数等多个方面,为各种数学相关的计算和处理提供了强大的支持,是JavaScript编程中不可或缺的一部分。