当前位置: 首页 > article >正文

XMLHttpRequest拦截请求和响应

环境: angular
实现: 拦截请求 向请求信息增加字段
            拦截响应 过滤返回值
响应拦截:
根据angular使用的XMLHttpRequest 将对原本的请求转移到另一个将监听返回事件挂载到另一个世纪发送请求的xml上
使用get set 将客户端获取的responseText和response按照自己的意愿返回实现响应拦截

请求拦截
比较简单了 网上也比较常见
修改send函数的参数即可


const CommentReg = new RegExp(
    /\\/api\\/.+\\/.+\\/[0-9a-f]{24}\\/comment(\\/[0-9a-f]{24})*/
);
const GetCommentsReg = new RegExp(
    /\\/api\\/.+\\/.+\\/[0-9a-f]{24}\\/comments*/
);

const MyXMLHttpRequest = window.XMLHttpRequest;

class InterceptXML extends window.XMLHttpRequest {
    constructor(...p) {
        super(...p);
    }

    addEventListener(t, fn) {
        super.addEventListener(t, fn)
    }

    get hasInjectDom() {
        return document.getElementById("insertCheckBox")
    }

    _statusText = "";
    
    get statusText() {
        return this._statusText || super.statusText;
    }

    set statusText(val) {
        this._statusText = val;
    }

    _status = "";

    get status() {
        return this._status || super.status;
    }

    set status(val) {
        this._status = val;
    }

    
    _response = "";

    get response() {
        return this._response || super.response;
    }

    set response(val) {
        this._response = val;
    }

    
    _responseText = "";

    get responseText() {
        return this._responseText || super.responseText;
    }

    set responseText(val) {
        this._responseText = val;
    }

    
    cover(method, url) {
        const xml = new MyXMLHttpRequest();
        xml.open(method, url, true);

        this.addEventListener = (type,callback) => {
            if (type == 'load') {
                this.getAllResponseHeaders = () => {
                    return xml.getAllResponseHeaders()
                }
                xml.addEventListener(type, () => {
                    this.statusText = xml.statusText;
                    this.status = xml.status;
                    this.response = xml.response;
                    this.responseText = xml.responseText;
                    callback()
                })
                // 处理dom
                xml.addEventListener("loadend", () => {
                    requestAnimationFrame(() => {
                        requestAnimationFrame(() => {
                            
                        })
                    })
                })
            }
            else xml.addEventListener(type,callback)
        }

        this.setRequestHeader = (...r) => {
            xml.setRequestHeader(...r)
        }

        this.send = () => {
            xml.send();
        }
    }

    open(method, url) {
        if (method === 'GET' && GetCommentsReg.test(url)) { 
           return this.cover(method, url);
        } else {
            if (["POST", "PUT","DELETE"].includes(method) && CommentReg.test(url) && this.hasInjectDom) {
                const originalSend = super.send;
                super.send = function (data) {
                    const modifiedData = Object.assign(
                        { is_private: window._is_private_comment || false },
                        JSON.parse(data)
                    );
                    originalSend.call(this,JSON.stringify(modifiedData));
                };
            }
            super.open(method, url);
        }
    }
}

window.XMLHttpRequest = InterceptXML;

http://www.kler.cn/news/107787.html

相关文章:

  • Unity性能优化一本通
  • YOLOv5 onnx \tensorrt 推理
  • uniapp接口请求api封装,规范化调用
  • Go 实现插入排序算法及优化
  • 软考系列(系统架构师)- 2013年系统架构师软考案例分析考点
  • 5月22日比特币披萨日,今天你吃披萨了吗?
  • 【计算机网络】认识协议
  • Spring Boot拓展XML格式的请求和响应
  • 『Jmeter入门万字长文』 | 从环境搭建、脚本设计、执行步骤到生成监控报告完整过程
  • leetCode 229. 多数元素 II + 摩尔投票法 + 进阶 + 优化空间
  • Linux:【1】Linux中的文件权限概念和相关命令
  • Hive 视图和索引
  • Spring Security—配置(Configuration)
  • 命令行参数、环境变量
  • 集合总结(Java)
  • JavaScript_Pig Game切换当前玩家
  • 【Linux】权限完结
  • 从lc560“和为 K 的子数组“带你认识“前缀和+哈希表“的解题思路
  • 【iPad已停用】解锁教程
  • 现代挖掘机vr在线互动展示厅是实现业务增长的加速度
  • Java集合-HashMap源码分析
  • Docker多平台、跨平台编译打包
  • 【ChatGPT系列】ChatGPT:创新工具还是失业威胁?
  • spark3.3.x处理excel数据
  • 【Python机器学习】零基础掌握RandomForestClassifier集成学习
  • 小程序原生开发中的onLoad和onShow
  • Games104现代游戏引擎笔记 网络游戏进阶架构
  • Spring定时任务+webSocket实现定时给指定用户发送消息
  • SpringBoot内置工具类之断言Assert的使用与部分解析
  • CVPR2023新作:基于组合空时位移的视频修复