0

0

JavaScript网络请求拦截与修改

狼影

狼影

发布时间:2025-11-17 23:13:02

|

468人浏览过

|

来源于php中文网

原创

通过重写 xmlhttprequest 的 open 和 send 方法可拦截 ajax 请求,添加认证头、修改请求体或响应数据。2. 拦截 fetch 需替换全局方法,可在请求前修改参数,响应后处理数据。3. 使用 proxy 可实现动态、可配置的请求拦截。4. 注意拦截仅能包裹行为,存在兼容性与调试风险,生产环境慎用。

javascript网络请求拦截与修改

在现代前端开发中,JavaScript网络请求的拦截与修改是一项实用技术,常用于调试、模拟接口、性能监控或安全校验。虽然浏览器原生不提供直接的“拦截”API,但可以通过覆盖全局对象方法来实现对网络请求的控制。

1. 拦截 XMLHttpRequest 请求

XMLHttpRequest 是传统 AJAX 请求的核心对象。通过重写其关键方法,可以在请求发出前或响应返回后插入自定义逻辑。

以下是一个简单的拦截示例:

const originalOpen = XMLHttpRequest.prototype.open;
const originalSend = XMLHttpRequest.prototype.send;

// 重写 open 方法,保存请求配置
XMLHttpRequest.prototype.open = function(method, url, ...args) {
  this._url = url;
  this._method = method;
  return originalOpen.apply(this, args);
};

// 重写 send 方法,可在发送前修改数据或添加头信息
XMLHttpRequest.prototype.send = function(body) {
  // 示例:统一添加认证头
  this.setRequestHeader('Authorization', 'Bearer token123');

  // 示例:修改请求体(如 JSON 数据)
  if (typeof body === 'string' && body.includes('sensitive')) {
    body = body.replace('sensitive', 'filtered');
  }

  // 请求完成后的拦截
  this.addEventListener('load', function() {
    if (this._url.includes('/api/user')) {
      console.log('用户数据请求完成,响应:', this.responseText);
      // 可在此修改 responseText(需用 defineProperty)
      const originalResponse = this.responseText;
      Object.defineProperty(this, 'responseText', {
        value: originalResponse.replace('"admin":true', '"admin":false')
      });
    }
  });

  return originalSend.call(this, body);
};

2. 拦截 fetch 请求

fetch 是基于 Promise 的现代请求方式,拦截方式不同于 XMLHttpRequest。我们可以通过替换全局 fetch 来实现拦截。

立即学习Java免费学习笔记(深入)”;

千问智学
千问智学

阿里旗下AI教育应用(原夸克学习APP)

下载
const originalFetch = window.fetch;

window.fetch = function(resource, options) {
  // 请求前:修改 headers 或 body
  const newOptions = {
    ...options,
    headers: {
      ...options?.headers,
      'Authorization': 'Bearer token123'
    }
  };

  // 示例:对特定接口修改请求体
  if (resource.includes('/api/submit')) {
    const originalBody = newOptions.body;
    if (originalBody && typeof originalBody === 'string') {
      newOptions.body = originalBody.replace('realname', 'anonymous');
    }
  }

  // 返回包装后的 Promise,可处理响应
  return originalFetch(resource, newOptions).then(response => {
    // 克隆响应以便修改
    const cloned = response.clone();
    
    if (resource.includes('/api/profile')) {
      // 示例:修改返回的 JSON 数据
      cloned.json().then(data => {
        if (data.isAdmin) {
          console.warn('检测到管理员权限,前端已屏蔽');
          // 注意:这里不能直接修改原始响应,只能影响后续使用
        }
      });
    }

    return response; // 原始响应仍正常返回
  });
};

3. 使用 Proxy 实现更精细控制

若需动态开启/关闭拦截,或针对不同环境做处理,可用 Proxy 包装请求对象,实现更灵活的管理。

例如,封装一个可配置的 fetch 代理:

function createFetchProxy(config) {
  return new Proxy(window.fetch, {
    apply(target, thisArg, argumentsList) {
      let [resource, options] = argumentsList;

      if (config.modifyRequest) {
        options = config.modifyRequest(options, resource);
      }

      return target.apply(thisArg, [resource, options]).then(response => {
        if (config.interceptResponse) {
          return config.interceptResponse(response, resource);
        }
        return response;
      });
    }
  });
}

// 使用示例
window.fetch = createFetchProxy({
  modifyRequest(options) {
    options.headers['X-Debug'] = 'true';
    return options;
  },
  interceptResponse(response) {
    console.log(`请求 ${response.url} 状态:${response.status}`);
    return response;
  }
});

4. 注意事项与限制

拦截网络请求虽强大,但也存在一些限制和风险:

  • 无法真正“阻止”原生行为,只能包裹或修改输入输出
  • 某些第三方库可能使用自己的 HTTP 客户端,绕过全局拦截
  • 过度修改可能导致调试困难或与其他脚本冲突
  • 生产环境中应谨慎使用,避免影响正常业务逻辑
  • Service Worker 可提供更底层的拦截能力,但需 HTTPS 支持

基本上就这些。掌握这些技巧后,你可以实现日志记录、敏感数据过滤、接口 mock、权限降级等实用功能。关键是理解请求生命周期,并在合适阶段插入逻辑。不复杂但容易忽略细节。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

166

2023.06.14

ajax中文乱码解决方法
ajax中文乱码解决方法

ajax中文乱码解决方法有设置请求头部的字符编码、在服务器端设置响应头部的字符编码和使用encodeURIComponent对中文进行编码。本专题为大家提供ajax中文乱码相关的文章、下载、课程内容,供大家免费下载体验。

170

2023.08.31

ajax传递中文乱码怎么办
ajax传递中文乱码怎么办

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

124

2023.11.15

ajax网站有哪些
ajax网站有哪些

使用ajax的网站有谷歌、维基百科、脸书、纽约时报、亚马逊、stackoverflow、twitter、hacker news、shopify和basecamp等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

252

2024.09.24

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1772

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

569

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2338

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

43

2026.01.19

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

3

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.7万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.2万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号