JavaScript 获取二级域名的方法

简介: 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
  }
}


参考


相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
8天前
|
存储 JavaScript 索引
JS中数组的相关方法介绍
JS中数组的相关方法介绍
|
10天前
|
JavaScript 前端开发 容器
AJAX载入外部JS文件到页面并让其执行的方法(附源码)
AJAX载入外部JS文件到页面并让其执行的方法(附源码)
14 0
|
11天前
|
JSON JavaScript 前端开发
JavaScript原生代码处理JSON的一些高频次方法合集
JavaScript原生代码处理JSON的一些高频次方法合集
|
1月前
|
JavaScript 前端开发
解释 JavaScript 中的`map()`、`filter()`和`reduce()`方法的用途。
解释 JavaScript 中的`map()`、`filter()`和`reduce()`方法的用途。
17 1
|
1月前
|
JavaScript
JS绑定事件的三种方法(简单易懂)
JS绑定事件的三种方法(简单易懂)
|
1月前
|
JavaScript
JS中改变this指向的六种方法
JS中改变this指向的六种方法
|
8天前
|
JavaScript 前端开发 索引
JavaScript中与字符串相关的方法
JavaScript中与字符串相关的方法
|
1月前
|
JavaScript
JS数组增删方法的原理,使用原型定义
JS数组增删方法的原理,使用原型定义
|
1天前
|
JavaScript 前端开发 Java
js 垃圾回收机制的方法
js 垃圾回收机制的方法
|
1天前
|
JavaScript 前端开发
js数据类型有几类?一共有几种?判断数据类型的方法是什么?
js数据类型有几类?一共有几种?判断数据类型的方法是什么?