js实现拦截器进行请求处理

js实现拦截器

因为公司需求,在前端请求接口的过程中,我们的某个接口参数必须经过一次加密,因为用到这个接口的地方有点多,如果在对应的业务js文件中一个一个改,那工作量就有点大了,幸好这些页面中都有使用到一个公共js,那么我们直接在里面通过ajaxSetup实现类似拦截器的效果。

​ 废话不多说,直接上代码。需要注意,我的后端是用的java哦,解码也是用的java。

公共js

	//其他逻辑处理代码省略...

	//字符串转base64
    function getEncode64(str){
        // 用这种方式可避免中文乱码
        return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
            function toSolidBytes(match, p1) {
                return String.fromCharCode('0x' + p1);
            }));
    }
	// 通过ajaxSetup在请求发送前对参数进行加密处理
    $.ajaxSetup({
        beforeSend: function (xhr) {
            if (arguments[1].type === "GET") {
                var data = arguments[1].url.split("?");
                var ip = data[0];
                var params = data[1];
                var paramsJson = {};
                if (params) {
                    // 解析参数
                    params.replace(/([^?&]+)=([^?&]+)/g, function (s, v, k) {
                        paramsJson[v] = decodeURIComponent(k);
                        return k + '=' + v;
                    });
                    if ("content" in paramsJson) {
                        var content = getEncode64(paramsJson.content);
                        paramsJson.content = content;
                        var paramsString = "";
                        //将json格式转化为urlcode编码格式的数据
                        for (var key in paramsJson) {
                            paramsString = paramsString + key + "=" + encodeURIComponent(paramsJson[key]) + "&";
                        }
                        paramsString.substr(0, paramsString.length - 1);
                        //修改参数
                        arguments[1].url = ip + "?" + paramsString;
                    }
                }
            } else {
                var params = arguments[1].data;
                //将urlcode编码转化为json
                if (params) {
                    var paramsJson = {};
                    // 解析参数
                    params.replace(/([^?&]+)=([^?&]+)/g, function (s, v, k) {
                        paramsJson[v] = decodeURIComponent(k);
                        return k + '=' + v;
                    });
                    if ("content" in paramsJson) {
                        var content = getEncode64(paramsJson.content);
                        paramsJson.content = content;
                        var paramsString = "";
                        //将json格式转化为urlcode编码格式的数据
                        for (var key in paramsJson) {
                            paramsString = paramsString + key + "=" + encodeURIComponent(paramsJson[key]) + "&";
                        }
                        paramsString.substr(0, paramsString.length - 1);
                        //修改参数
                        arguments[1].data = paramsString;
                    }
                }
            }
        }
    });

业务js

	// 其他业务代码省略...
	function test() {
        $.ajax({
            type: "POST",
            url: "http://localhost:8083/testController/test",
            data: {content: "奥利给"},
            success: function (data) {
                console.log(data);
            },
            //失败回调
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                //查看错误信息

            }
        });
    }

java后端接口

    @PostMapping(value = "test")
    @ApiOperation(value = "测试接口")
    public void test(String content) {
        boolean isBase = Base64Util.isFromBase64(content);
        if(isBase){
            String test = Base64Util.getFromBase64(content);
            log.info("获取到字符串:"+test);
        }
    }

Base64Util

import java.io.UnsupportedEncodingException;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Base64Util {
    //加密
    public static String getBase64(String str){
        byte[] b=null;
        String s=null;
        try {
            b = str.getBytes("utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        if(b!=null){
            s=new BASE64Encoder().encode(b);
        }
        return s;
    }
    // 解密
    public static String getFromBase64(String s) {
        byte[] b = null;
        String result = null;
        if (s != null) {
            BASE64Decoder decoder = new BASE64Decoder();
            try {
                b = decoder.decodeBuffer(s);
                result = new String(b, "utf-8");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return result;
    }
    // 通过正则表达式判断是否base64加密过的字符串
    public static boolean isFromBase64(String inputStr) {
        String base64Pattern = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$";
        Boolean isLegal = inputStr.matches(base64Pattern);
        if (!isLegal) {
            return false;
        }
        return true;
    }
}

你可能感兴趣的:(Java,java)