returnUrl.js 1.03 KB
/**
 * @description 对 return_url 做安全解码,兼容被重复 encode 的情况
 * @param {string} value
 * @returns {string}
 */
export const normalizeReturnUrl = (value = '') => {
  let normalized = String(value || '').trim()

  if (!normalized) {
    return ''
  }

  let previousValue = ''

  while (normalized && normalized !== previousValue) {
    previousValue = normalized

    try {
      normalized = decodeURIComponent(normalized)
    } catch (error) {
      break
    }
  }

  if (!normalized.startsWith('/')) {
    normalized = `/${normalized.replace(/^\/+/, '')}`
  }

  return normalized
}

/**
 * @description 给页面地址追加 return_url 参数
 * @param {string} url
 * @param {string} returnUrl
 * @returns {string}
 */
export const appendReturnUrlParam = (url, returnUrl = '') => {
  const normalizedReturnUrl = normalizeReturnUrl(returnUrl)

  if (!normalizedReturnUrl) {
    return url
  }

  const separator = url.includes('?') ? '&' : '?'
  return `${url}${separator}return_url=${encodeURIComponent(normalizedReturnUrl)}`
}