首页 > 其他分享 >XMLHttpRequest拦截请求和响应

XMLHttpRequest拦截请求和响应

时间:2023-10-30 12:05:03浏览次数:41  
标签:xml XMLHttpRequest statusText 响应 ._ responseText 拦截 super response


环境: 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;


标签:xml,XMLHttpRequest,statusText,响应,._,responseText,拦截,super,response
From: https://blog.51cto.com/u_15964288/8087230

相关文章

  • Springboot拦截器的使用
    1.拦截器(Interceptor)在SpringBoot中,拦截器是基于SpringMVC框架的一部分,主要用于对控制器方法进行拦截处理。拦截器是通过实现HandlerInterceptor接口来定义的其中包括三个主要方法:preHandle、postHandle和afterCompletion。1.preHandle方法在进入控制器方法之前执行2.postHan......
  • FastAPI学习-21.response 参数-设置响应Cookies
    前言可以在 路径函数 中定义一个类型为 Response的参数,这样你就可以在这个临时响应对象中设置cookie了。response参数设置cookiesfromfastapiimportFastAPI,Responseapp=FastAPI()@app.post("/cookie-and-object/")defcreate_cookie(response:Response):res......
  • FastAPI学习-20.response 参数-设置响应头部
    前言你可以在你的_路径操作函数_中声明一个Response类型的参数。设置响应头部你可以在这个_临时_响应对象中设置头部fromfastapiimportFastAPI,Responseapp=FastAPI()@app.get("/headers-and-object/")defget_headers(response:Response):response.headers["X-C......
  • FastAPI学习-16.响应状态码 status_code
    前言与指定响应模型的方式相同,你也可以在以下任意的_路径操作_中使用 status_code 参数来声明用于响应的HTTP状态码:@app.get()@app.post()@app.put()@app.delete()响应状态码fromfastapiimportFastAPIapp=FastAPI()@app.post("/items/",status_code=201)asyncdef......
  • FastAPI学习-17.其它响应html,文件,视频或其它
    前言通过我们返回JSON类型的接口会比较多,除了返回JSON格式,还可以响应其它格式的内容JSONResponseContent-Type 会被设置成 application/jsonHTMLResponseContent-Type 会被设置成 text/htmlPlainTextResponse Content-Type 会被设置成text/plainORJSONResponse......
  • Kafka 生产者API,消费者API,拦截器,流计算
    pom文件如下:<dependencies> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId......
  • 常用的响应状态码有哪些?
    1.1xx【临时响应】需要请求这继续发送。    100:继续请求。101:切换协议。2.2xx【成功】处理了请求。    200:处理成功。3.3xx【重定向】完成请求,需要进一步操作。    301:服务器地址更改。4.4xx【错误请求】客户端请求错误。 403:服务器拒绝请求。404:无法找到请......
  • geoserver发布wms服务设置缓存响应头
    在Geoserver中发布WMS服务时,可以通过以下步骤设置缓存:打开Geoserver的管理界面,并进入“图层”页面。点击发布标签,就可以看到CachingSettings设置完成后,点击“保存”按钮保存更改即可生效。通过以上步骤,就可以在Geoserver中为WMS服务设置缓存了。......
  • 过滤器和拦截器区别
    过滤器和拦截器区别InteceptorFilter所属包在spring包在javax包属于哪个容器属于web容器属于spring容器资源的使用不能获取spring的资源可以获取spring的资源过滤先后后前使用场景和业务相关如日志处理统计业务无关的公共代码例如设置......
  • 基于sm-crypto的sm4的请求加密&响应加密
    有时候需要对项目的请求和返回值进行加密请求,因而笔者使用了sm4,读者也可以使用别的库如md5封装加解密://ciphertext.jsconstsm4=require('sm-crypto').sm4//此为密文key,非常重要exportconstCIPHERTEXT=`wzdxcskwzdxcskwzdxcskwzdxcskwzdxcsk`//我真的想吃烧烤我真的......