url请求参数带有特殊字符“%、#、&”时,参数被截断怎么办?

是的,最近又踩坑了!

事情是这样的,我们测试小姐姐在一个全局搜索框里输入了一串特殊字符"%%%",然后进行搜索,结果报错了。而输入常规字符,均可以正常搜索。

一排查,发现特殊字符"%%%"并未成功传给后端。

我们的这个全局搜索功能是需要跳转页面才能查看到搜索结果的。所以,搜索条件是作为参数拼接在页面url上的。

正常的传参:

当输入的是特殊字符"%、#、&"时,参数丢失

也就是说,当路由请求参数带有浏览器url中的特殊含义字符时,参数会被截断,无法正常获取参数。

那么怎么解决这个问题呢?

方案一:encodeURIComponent/decodeURIComponent

拼接参数时,利用encodeURIComponent()进行编码,接收参数时,利用decodeURIComponent()进行解码。

js 复制代码
// 编码
this.$router.push({path: `/crm/global-search/search-result?type=${selectValue}&text=${encodeURIComponent(searchValue)}`});

// 解码
 const text = decodeURIComponent(this.$route.query.text)

此方法对绝大多数特殊字符都适用,但是唯独输入"%"进行搜索时不行,报错如下。

所以在编码之前,还需进行一下如下转换:

js 复制代码
this.$router.push({path: `/crm/global-search/search-result?type=${selectValue}&text=${encodeURIComponent(encodeSpecialChar(searchValue))}`});


/**
 * @param {*} char 字符串
 * @returns
 */
export const encodeSpecialChar = (char) => {
  // #、&可以不用参与处理
  const encodeArr = [{
    code: '%',
    encode: '%25'
  },{
    code: '#',
    encode: '%23'
  }, {
    code: '&',
    encode: '%26'
  },]
  return char.replace(/[%?#&=]/g, ($) => {
    for (const k of encodeArr) {
      if (k.code === $) {
        return k.encode
      }
    }
  })
}

方案二: qs.stringify()

默认情况下,qs.stringify()方法会使用encodeURIComponent方法对特殊字符进行编码,以保证URL的合法性。

js 复制代码
const qs = require('qs');

const searchObj = {
  type: selectValue,
  text: searchValue
};
this.$router.push({path: `/crm/global-search/search-result?${qs.stringify(searchObj)}`});

使用了qs.stringify()方法,就无需使用encodeSpecialChar方法进行转换了。

相关推荐
椰羊~王小美11 分钟前
除了前端 JS 配置的国际化,对于 JS 没覆盖到的文本,怎么实现国际化
前端·javascript·状态模式
AC赳赳老秦19 分钟前
DBA 专属方案:用 OpenClaw 实现 SQL 语句优化、慢查询分析、数据库备份巡检全自动化
服务器·前端·数据库·ffmpeg·自动化·deepseek·openclaw
燐妤36 分钟前
前端HTML编程1:初识html
前端·html5
xiaoye370837 分钟前
java接口文档工具 swagger2和swagger3对比
java·服务器·前端
tongyiixiaohuang39 分钟前
基于轻易云的数据集成,实现企业系统间灵活对接
java·前端·数据库
哥本哈士奇1 小时前
Power BI学习笔记第17篇:Power BI Dashboard 常用布局方案推荐
前端·powerbi
军军君011 小时前
数字孪生监控大屏实战模板:固体颗粒物监管平台
前端·javascript·vue.js·typescript·前端框架·echarts·less
菜鸟小码1 小时前
MapReduce 核心思想:分而治之,大数据处理的智慧之源
前端·javascript·mapreduce
前端那点事1 小时前
Cookie和Token的核心区别(附使用场景,易懂好记)
前端·vue.js
前端那点事1 小时前
Vue设计模式实战解析:6种高频模式+源码拆解,面试/开发双适用
前端·vue.js