当项目需要,有些统一认证/单点登录登录成功后,会给我们的登录地址后面加上认证参数,需要我们提取这个参数去做登录处理。
因为业务发生在内网机无法截图,下图借图其他博主。
此时经过浏览器访问时,链接中特殊字符“+”被转义会被为%20。
按照w3c转码标准,空格应该被转译成%20,+号被转义成%2B。
因为业务发生在内网机无法截图,下图 借图 其他博主。
我们会发现利用 decodeURIComponent解码时,%20会被我们解码成' '(空格),从而导致解密失败,提取不到我们想要的参数;
解决办法:
将拿到的地址链接中的%20全部替换成'+',然后进行decodeURIComponent解码;
//从浏览器url地址提取?后面的参数,结果为 data。
let data = {};
let src = window.location.search
let index = src.indexOf("?");
let dataStr = src.substring(src.indexOf("?") + 1);
let dataArray = dataStr.split("&");
for (let i = 0; i < dataArray.length; i++) {
let param = dataArray[i].split("=");
data[param[0]] = param[1];
}
console.log('登录成功后返回的原参数', data)
// 修复浏览器url个别转码出错问题。
const strData1 = data.SSIAuth.replace(/%20/g, "%2B")
//由于url中返回参数的 +号被转义成 %20,其实应该是 %2B,后台再次反转义 %20会转成 空格
const strData2 = data.SSISign.replace(/%20/g, "%2B")
//由于url中返回参数的 +号被转义成 %20,其实应该是 %2B,后台再次反转义 %20会转成 空格
(如有更好的解决办法还请多多指教)
扫描二维码关注公众号,回复:
15919260 查看本文章