vue应用中URL查询参数传递时,特殊字符(如+、/、=)的转义问题常常困扰开发者,尤其在单点登录场景中。浏览器会自动对URL中的某些字符进行编码,导致前端接收到的参数与原始参数不符。
问题:
单点登录流程中,用户通过包含id和key参数的URL跳转到白名单页面。例如,URL为:
http://localhost:8088/taxbureaulogin?id=1206&key=ze9+ticzsrej...
浏览器可能将其编码为:
立即学习“前端免费学习笔记(深入)”;
http://localhost:8088/taxbureaulogin?id=1206&key=ze9%2Bticzsre...
Vue前端代码使用URLSearchParams获取key值:
let searchparams = new URLSearchParams(window.location.search);
但获取到的key值与预期不符:
原始字符:ze9+ticzsrejfujj/bxjcq== 获取后:ze9 ticzsrejfujj/bxjcq== // '+' 变成了空格
解决方案:
最佳方案是在后端生成Token时进行Base64URL编码,避免+、/、=等特殊字符。如果后端无法修改,前端可以使用encodeURIComponent处理获取到的token值。
Vue-router版本的影响:
-
Vue-Router 3.x: 自动解码特殊字符。使用location API获取URL信息时,数据已经是解码后的结果。建议在后端处理特殊字符,而非依赖前端处理。
-
Vue-Router 4.x: 不会自动解码特殊字符,保持URL参数的一致性。
测试代码:
var testUrl = 'http://localhost:8088/taxBureauLogin?test=123+A'; location.href = testUrl; // 浏览器跳转后获取query信息 new URLSearchParams(window.location);
测试结果表明浏览器会自动对特殊字符进行编码。
总结:
为了避免URL参数传递中的特殊字符转义问题,建议在后端生成token时进行Base64URL编码或其他合适的编码处理,确保前端接收到的参数与原始参数一致。 这比依赖前端处理更可靠和高效。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END