当前位置: 首页 > news >正文

日常记录-识别游览器地址栏参数内容值失败的原因

最近工作中临时被指派排查一个问题,预览文件时,会导致预览页面的其它元素隐藏。之后拉取代码发现,进入页面后会通过一个获取地址栏参数的方法获取地址栏中传入的参数信息去处理业务信息。

// 获取地址栏参数

export function GetQueryString(name) {let reg: any = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')let r = window.location.search.substr(1).match(reg) //获取url中"?"符后的字符串并正则匹配let context = ''if (r != null) {context = decodeURIComponent(r[2])}reg = nullr = nullreturn context == null || context == '' || context == 'undefined' ? '' : context
}

 最终排查传入的地址栏参数,发现出现问题是因为地址栏中传入了预览的文件名称。且文件名称包含了特殊字符导致程序上识别失败。

 示例:文件名:  16#测试文件名称

image

 实际运行之后发现返回结果不对

image

 文件名被截断了,并且导致后面的参数获取也出现问题。而导致这样的原因是因为 # 字符在URL中属于特殊字符,它表示 URL 的片段标识符(fragment),从而其后的部分不会包含在 window.location.search 中,这也就能解释为什么后面console中都是空字符。

解决方案:

  方案一:针对#字符进行处理(不足点: 无法满足所有的场景, 如果文件名包含其它字符 类似 % & 同样也会出现不能完整获取名称的情况)

export function GetQueryString(name) {const url = window.location.href// 构建正则表达式,注意处理参数值中可能包含 # 符号的情况const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')// 先获取完整的 URL 中 ? 后面的部分const queryString = url.split('?')[1] || ''let match = queryString.match(reg)let context = ''if (match) {// 提取参数值context = decodeURIComponent(match[2])// 检查参数值是否被截断(因为包含 # 符号)if (context.includes('#')) {// 找到参数在 URL 中的完整位置const paramStart = url.indexOf(name + '=')if (paramStart !== -1) {// 找到下一个 & 符号的位置const nextAmp = url.indexOf('&', paramStart)// 如果没有下一个 &,则取到 URL 末尾const paramEnd = nextAmp !== -1 ? nextAmp : url.length// 提取完整的参数值const fullParam = url.substring(paramStart + name.length + 1, paramEnd)context = decodeURIComponent(fullParam)}}}return context == null || context == '' || context == 'undefined' ? '' : context
}

  方案二:业务逻辑进行修改,外面不传入文件名称,进入预览页面之后,通过接口从后端获取文件名称(这样可以万无一失,但是针对目前业务场景不满足)

 

  方案三:针对可能存在特殊字符的字段,在跳转进预览之前,进行内容编码加密,并在进入页面之后,通过获取地址栏参数函数进行解密(encodeURIComponent 加密  decodeURIComponent 解密)

image

 

方案三进阶:(亮点:现代浏览器推荐使用 URLSearchParams 来解析查询参数,它更简洁、安全,且能自动处理编码,无需手动解码, 这个方法同样能正确解码 encodeURIComponent 编码的值,且避免正则表达式可能存在的边界问题(如参数值中包含 & 或 = 但未编码的情况))

export function GetQueryString(name) {const context = new URLSearchParams(window.location.search).get(name) || ''return context == null || context == '' || context == 'undefined' ? '' : context
}

  

http://www.jsqmd.com/news/443468/

相关文章:

  • ‌JMeter分布式部署:提升TPS 300%实战案例全解析
  • 基于YOLOv8的火灾烟雾识别(中英文双版) | 附完整源码与效果演示
  • zblogphp提示“ Call to undefined function openssl_pkey_get_public()”的原因和解决办法
  • 测试博文标题 2026-03-06 14:14:57.656229 - agihub
  • 2026年 垃圾转运站设备厂家推荐榜单:地埋式/移动式/生活垃圾转运站设备,高效环保与技术创新实力解析 - 品牌企业推荐师(官方)
  • 投标实务指南:从招标文件解读到标书制作全流程
  • 京东e卡回收高效方案,秒变现金! - 团团收购物卡回收
  • 高并发测试指南:电商下单流程防崩溃架构深度解析
  • Array.from()
  • 2026电线电缆厂家五大推荐:实力铸就品质,华科中缆领衔行业新标杆 - 深度智识库
  • ‌响应时间优化:数据库索引调整秘籍
  • 新疆国旅来样定制旅游性价比怎样,推荐哪家? - 工业设备
  • 风机无人机巡检:当飞行器成为风力发电的“空中医生”
  • 实测不踩雷✨十大手动剃须刀品牌|男生理容修毛全适配 - 品牌测评鉴赏家
  • 总结马鞍山潮源汇3M旗舰店特色,看看它在当地是否值得选择 - 工业品网
  • 芯谷科技—78MXX系列三端固定电压稳压器
  • IT 工单系统与企业流程审批系统,看起来相似,实际上用途完全不同
  • BrowserStack负载测试中的渲染机制剖析
  • 2026年上海阿里云企业邮箱服务商推荐,安全稳定高效办公解决方案 - 品牌2026
  • 想做全国业务,哪些 GEO 优化服务商值得选? - 品牌推荐大师
  • MOSS-TTS:基于 CAT 架构的解耦式生产级语音生成模型;打破单细胞分析壁垒:Pan-Cancer scRNA-Seq 数据集构建跨癌种免疫图谱基准
  • GEO全链路服务的完整定义:从概念到落地 - 一搜百应
  • 2026大健康创业TOP5|热门方向+知名品牌 合作创业指南 - 品牌智鉴榜
  • 2026年环保设备厂家推荐排行榜:洒水车/洗车机/雾炮机/扫地机/降尘设备等源头工厂,专业实力与高效清洁解决方案深度解析 - 品牌企业推荐师(官方)
  • 2026年上海物流公司推荐榜单:智能仓储/冷链运输/大件托运/电商仓储等专业服务商实力解析与口碑之选 - 品牌企业推荐师(官方)
  • 变频/液压站/恒温油冷机品牌与厂家深度评测:节能高效与智能控制的优选方案 - 品牌推荐大师
  • 老王-银发经济与国产替代
  • 2026实测|手动剃须刀品牌排行榜,新手/敏感肌闭眼入不踩雷 - 品牌测评鉴赏家
  • 2026年京东e卡回收平台全方位盘点,老司机带你避坑 - 京回收小程序
  • emlog无法下载安装包,提示:安装失败、无法下载安装包