You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

axios@1.6.0中X-XSRF-TOKEN头自动生成问题及优化方案咨询

更优解决方案推荐

1. 优化可信主机校验逻辑

你当前用startsWith判断URL存在误判风险(比如可能匹配到https://example.com.attacker.com这类恶意域名),可以用URL对象精准提取主机名校验:

import axios from 'axios';

const instance = axios.create();
const trustedHosts = new Set(['example.com', 'api.example.com']); // 仅存主机名,无需协议

instance.interceptors.request.use((config) => {
  try {
    // 处理绝对/相对URL,统一解析出主机名
    const url = new URL(config.url, window.location.origin);
    if (trustedHosts.has(url.hostname)) {
      // 简化Cookie获取逻辑,无需依赖外部函数
      const token = document.cookie.split('; ').find(row => row.startsWith('XSRF-TOKEN='))?.split('=')[1];
      if (token) {
        config.headers['X-XSRF-TOKEN'] = token;
      }
    }
  } catch (e) {
    // 捕获无效URL解析错误,不影响请求发送
  }
  return config;
});

2. 扩展Axios内置XSRF逻辑(替代拦截器)

Axios原生XSRF自动填充依赖同源判断,你可以重写它的同源校验函数,把可信主机纳入允许范围:

import axios from 'axios';
import { isURLSameOrigin } from 'axios/lib/helpers/isURLSameOrigin';

const trustedHosts = new Set(['example.com', 'api.example.com']);

// 自定义同源判断规则:原生同源通过,或属于可信主机
const customIsSameOrigin = (url) => {
  if (isURLSameOrigin(url)) return true;
  try {
    const parsedUrl = new URL(url, window.location.origin);
    return trustedHosts.has(parsedUrl.hostname);
  } catch (e) {
    return false;
  }
};

// 替换Axios默认的同源判断逻辑
axios.defaults.isURLSameOrigin = customIsSameOrigin;

// 创建实例时直接启用原生XSRF配置,无需额外拦截器
const instance = axios.create({
  xsrfCookieName: 'XSRF-TOKEN',
  xsrfHeaderName: 'X-XSRF-TOKEN'
});

这种方式更贴合Axios的原生设计,不需要手动维护拦截器逻辑。

3. 复用Cookie获取逻辑

如果多处需要获取XSRF Token,可以封装成工具函数:

const getXsrfToken = () => {
  return document.cookie.split('; ').find(row => row.startsWith('XSRF-TOKEN='))?.split('=')[1];
};

在需要的地方直接调用,避免重复代码。

关于等待1.6.1版本

如果官方1.6.1版本会内置可信主机的XSRF配置,等待确实是最省心的方案。在此之前,上述方案可以让你的代码更健壮、更符合Axios的设计规范。

内容的提问来源于stack exchange,提问作者Valentin Panov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:33:17