import Base64 from "./base64"; //網址使用base64的方案 By Leeson_Hsu export default class Base64Url { constructor() { } /** * 傳入並轉為BASE64字串 * @param {*} sourceString 來源字串 */ static encodeUrlBase64(sourceString) { //使用暫時的變數來取代代入值,避免之後被覆寫 var base64String = "" + Base64.encode(JsonString); console.log("replace!!"); //base64在URL會有下列三種符號會有問題 var replacements = { "+": "." , "=": "-" , "/": "_" }; //必須使用正則覆蓋,多重replace會有異常沒覆蓋的問題 var finalString = Base64Url.replace(base64String, replacements); return finalString; } /** * 傳入一個BASE64字串,並將其解開 * @param {*} base64String */ static decodeUrlBase64(base64String) { //使用暫時的變數來取代代入值,避免之後被覆寫 var tmpString = "" + decodeURIComponent(base64String); //base64在URL會有下列三種符號會有問題 var replacements = { ".": "+" , "-": "=" , "_": "/" }; //必須使用正則覆蓋,多重replace會有異常沒覆蓋的問題 var finalBase64 = Base64Url.replace(tmpString, replacements); return Base64.decode(finalBase64); } /** * 使用正則覆蓋,否則原始多重replace會造成解析過慢來不及覆蓋的問題 * @param {*} SourceString * @param {*} replacements * * var replacements = { "a": "d" , "b": "e" , "c": "f" }; */ static replace(SourceString, replacements) { Array.prototype.each = function (trans) { for (var i = 0; i < this.length; i++) this[i] = trans(this[i], i, this); return this; }; Array.prototype.map = function (trans) { return [].concat(this).each(trans); }; RegExp.escape = function (str) { return new String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); }; function properties(obj) { var props = []; for (var p in obj) props.push(p); return props; } var regex = new RegExp(properties(replacements).map(RegExp.escape).join("|"), "g"); SourceString = SourceString.replace(regex, function ($0) { return replacements[$0]; }); return SourceString; } }