针对原生JS、jQuery实现登录态而进行网络请求的封装

在这里我都使用了ES6新语法Class,这样会少很多代码(可以看作构造函数+原型链的语法糖)

运用Get、Set函数对XHR进行简单的封装
在每次请求前,添加Cookie相关属性,向Header中加入Token,然后对返回值先进行一边解析,因为我这里是服务端返回50001代表登录态失效
如果失效我会直接将页面跳转到login,这里我使用replace,因为我不想让用户带着未登陆的状态回到应用内
运用对obj对象的属性修改来封装jQuery-Ajax
将创建实例所传的obj拿到,然后和对XHR进行封装一样,对obj增加jQuery特有的Cookie相关属性,然后增加检测服务器登录态状态返回值的方法(50001就跳转到login页面)
这里因为jQuery有相关的回调函数complete和beforeSend,所以我就可以使用这两个函数传入的参数进行相关的Token的添加
这里要注意的是我使用了cookie和token两种方式进行登录态的检查,cookie为优先检查方式,token则在cookie失效后检查,这需要后端的配合
总的来说,主要思想代码里都体现了,这是我很久之前做原生项目所使用的封装方法,现在学完axios之后就可以用axios和axios拦截器了

class XMLHttp {
    #xmlhttp = new XMLHttpRequest();

    constructor() {
        this.#init();
    }

    #init = () => {
        this.#xmlhttp.withCredentials = true;
        this.#xmlhttp.onerror = function() {
            showToast('网络错误', 'false');
        }
    }

    open(method, url, async) {
        this.#xmlhttp.open(method, url, async);
        let t = window.localStorage.getItem('token');
        // console.log(t);
        if (t) {
            this.#xmlhttp.setRequestHeader('token', t);
        }
    }

    setRequestHeader(...args) {
        this.#xmlhttp.setRequestHeader(...args);
    }

    send(objStr = "") {
        this.#xmlhttp.send(objStr);
    }

    get readyState() {
        return this.#xmlhttp.readyState;
    }

    get status() {
        return this.#xmlhttp.status;
    }

    get response() {
        let res = JSON.parse(this.#xmlhttp.response);
        if (res.status == 50001) {
            window.localStorage.setItem('isOut', 'true');
            window.location.replace('login.html');
        }
        let t = this.#xmlhttp.getResponseHeader('token');
        // console.log(t);
        if (t) {
            window.localStorage.setItem('token', t);
        }
        return this.#xmlhttp.response;
    }

    /**
     * @param {{(): void;}} fun
     */
    set onreadystatechange(fun) {
        this.#xmlhttp.onreadystatechange = () => {
            if (this.#xmlhttp.readyState == 4 && this.#xmlhttp.status != 200) {
                showToast('网络错误', 'false');
            }
            fun();
        };
    }

    /**
     * @param {{(): void}} fun
     */
    set onerror(fun) {
        this.#xmlhttp.onerror = function() {
            showToast('网络错误', 'false');
            fun();
        };
    }
}

class Ajax {
    constructor(obj) {
        obj.xhrFields = {
            withCredentials: true
        };
        obj.crossDomain = true;
        this.#init(obj);
    }

    #init = (obj) => {
        obj.complete = function (XMLHttpRequest, textStatus) {
            var t = XMLHttpRequest.getResponseHeader('token');
            if (t) {
                window.localStorage.setItem('token', t);
            }
        };
        obj.beforeSend = function(XMLHttpRequest) {
            let t = window.localStorage.getItem('token');
            if (t) {
                XMLHttpRequest.setRequestHeader('token', t);
            }
        };
        // console.log(obj);
        let oSuccess = obj.success;
        obj.success = function(res) {
            if (res.status == 50001) {
                window.location.replace('login.html');
            }
            oSuccess(res);
        }
        $.ajax(obj);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Samuel_luo。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值