原本通过后端返回的地址,进行a标签新开页面进行下载,但项目后期,发现越权问题,需要前端将token跟账户传过来,进行鉴权验证,
之前的项目中,有sso机构门户去验证当前浏览器是否登陆,目前所在的项目组,因为限制问题,无法之间去浏览器验证用户是否登录,需要前端自己传输token,当时方案两种:
1、通过get请求,header加上token,url拼接参数进行验证,但是因为项目的业务层,视图层分包进行,导致不能通过此种方案
2、通过post,最后验证发现底层的s3限制文件下载的方式,不能为post.
以上两种方案都是由于某些原因,不能实施;
遂只能通过url拼接参数加token,进行base64编码进行访问,代码如下:
if (typeof window !== "undefined") {
let accesstoken = getAccessHeaderNew().authorization;//token
let loginAda = window.btoa(getADA());//ada号是账户
loginAda = loginAda.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');//对编码后的字符串进行正则替换
let signature = loginAda + '.' + accesstoken;
let filekey = '/om/aftersales/RR15010000002520220225175340098.pdf'; //get file key from bff api
let signedUrl = getJwtSignedUrl() + filekey + '?X-Amy-Signature=' + signature;//getJwtSignedUrl() ---域名
window.open(signedUrl, '_blank');
}
window.open(),safari浏览器不兼容,safari默认是关闭弹框的,没法发要求用户去打开自己的设置,所以针对safari我们替换当前的url进行下载
if (downloadUrl) {
// window.open(signedUrl, "_blank");
const s3a = document.createElement('a');
s3a.href = signedUrl;
let ua = navigator.userAgent.toLowerCase();
let isSafari = (ua.indexOf('applewebkit') > -1 && ua.indexOf('mobile') > -1 && ua.indexOf('safari') > -1 &&
ua.indexOf('linux') === -1 && ua.indexOf('android') === -1 && ua.indexOf('chrome') === -1 &&
ua.indexOf('ios') === -1 && ua.indexOf('browser') === -1);
if (!isSafari || isDesktop) {//非safari 新开页面,则覆盖当前页面
s3a.target = "_blank";
}
document.body.appendChild(s3a)
s3a.click()
document.body.removeChild(s3a)
}