[B/S]URL 传递中文参数

解决方法:js中传参时先对中文数据使用escape函数编码,代理中对传入数据解码

1 js中编码

var url="http://127.0.0.1/domcfg.nsf/GetUserInfo?OpenAgent&UserName=" + escape("管理员/Lotus");
var xmlHttp=new ActiveXObject('Microsoft.XMLHTTP');
xmlHttp.open("Post",url,true);   
xmlHttp.send("");

2 代理中解码

Dim ss As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument

Set db=ss.CurrentDatabase
Set doc=ss.DocumentContext

Dim strPara As String
strPara=UnEscape(doc.Query_String_Decoded(0)) 

附:UnEscape解码函数
Function UnEscape(Byval strIn As String) As String
 Dim strOut As String
 Dim strChar As String
 Dim intPos As Integer
 Dim strAsc As String
 Dim blnAsc As Integer
 Do
  intPos = intPos + 1
  strChar = Mid$(strIn, intPos, 1)
  If strChar = "" Then
   Exit Do
  Elseif strChar = "%" Then
   blnAsc = True
  Elseif blnAsc Then
   If strChar = "u" Then
    strAsc = Mid$(strIn, intPos + 1, 4)
    intPos = intPos + 4
    strOut = strOut & Uchr(Clng("&h" & strAsc))
   Else
    strAsc = Mid$(strIn, intPos, 2)
    intPos = intPos + 1
    strOut = strOut & Uchr(Clng("&h" & strAsc))
   End If
   blnAsc = False
  Else
   strOut = strOut & strChar
  End If
 Loop
 UnEscape = strOut
End Function

<think>嗯,用户问的是URL参数压缩传递,这应该是指如何把URL中的查询参数进行压缩,以减少URL长度对吧?首先,我得回忆一下URL参数的结构。通常参数是键值对,用&连接,比如?a=1&b=2。如果参数很多,URL会变得很长,可能影响用户体验或者有长度限制。 那用户可能的需求是什么呢?可能是前端传递大量参数时,URL过长,导致问题。或者想优化参数传递,使其更简洁。需要先解释什么是URL参数压缩,然后说说常见的压缩方法。 常见方法有几种。比如使用缩写,把长的参数名缩短,像用"n"代替"username"。不过这可能降低可读性,需要前后端约定好。然后是Base64编码,把参数转为Base64字符串,但会增加长度,可能还要处理填充问题。另外,JSON压缩,将参数转为JSON再Base64编码,这样结构更清晰,但同样可能更长,需要考虑是否值得。 另外,有没有其他方法?比如gzip压缩,但URL中直接放二进制数据可能有问题,可能需要用DEFLATE或者其他算法,但需要前后端都支持解码。可能还要注意字符集的问题,比如URL安全字符,可能需要替换+/为-_等。 还要考虑是否使用第三方库,比如qss或jquery-deparam,或者自己实现编解码。另外,安全方面,压缩后的参数可能被篡改,是否需要加密或者签名? 可能还要提到实际应用场景,比如分页参数、筛选条件等,当参数多的时候压缩比较有用。但也要注意压缩后的URL对SEO的影响,或者用户是否可能直接修改参数的问题。 用户可能不太清楚具体如何实现,需要给出步骤和示例。比如,前端将参数对象转为JSON,Base64编码,后端解码处理。或者用缩写的方式,替换键名。 还要注意不同方法的优缺点比较,比如Base64虽然方便,但体积会增加,而缩写需要维护映射表。可能根据具体情况选择合适的方法。 有没有可能遗漏的方法?比如使用查询字符串的数组形式,或者逗号分隔值,但可能不算压缩。或者用URI组件编码,但可能已经默认处理了。 总结一下,应该分步骤介绍几种方法,每种方法的实现步骤,示例代码,以及优缺点。这样用户可以根据需求选择适合的方式。</think>URL参数压缩传递是指将URL中的查询参数(即`?key1=value1&key2=value2`部分)通过特定方式压缩,以缩短URL长度的技术。以下是逐步说明: --- ### 一、为什么需要压缩? 1. **缩短URL长度**:避免浏览器对URL长度的限制(IE限制2083字符) 2. **隐藏明文参数**:增强数据安全性 3. **优化传输效率**:减少网络请求数据量 --- ### 二、常见压缩方法 #### 方法1:键名缩写 ```javascript // 原始参数 { username: "John", age: 25, country: "US" } // 压缩后 ?u=John&a=25&c=US ``` **特点**: - 需要维护键名映射表 - 可读性下降 --- #### 方法2:Base64编码 ```javascript // 原始参数 ?search=手机&price_min=1000&price_max=2000 // 转换为JSON并编码 const params = { s: "手机", pmin: 1000, pmax: 2000 } const compressed = btoa(JSON.stringify(params)) // "eyJzIjoi6K+05YiwIiwicG1pbiI6MTAwMCwicG1heCI6MjAwMH0=" // 最终URL ?data=eyJzIjoi6K+05YiwIiwicG1pbiI6MTAwMCwicG1heCI6MjAwMH0= ``` **解码过程**: ```javascript const data = atob(urlParams.get('data')) // {"s":"手机","pmin":1000,"pmax":2000} ``` --- #### 方法3:JSON压缩(推荐) ```javascript // 使用第三方库(如 qs) import qs from 'qs'; const params = { filters: { category: ["电子", "图书"], price: { $gt: 100, $lt: 500 } } }; // 压缩过程 const compressed = qs.stringify(params, { encode: false }); // 得到:filters[category][0]=电子&filters[category][1]=图书&filters[price][$gt]=100&filters[price][$lt]=500 ``` --- ### 三、专业级方案 ```javascript // 使用lz-string库进行压缩 import LZString from 'lz-string'; const params = { /* 复杂参数对象 */ }; const compressed = LZString.compressToEncodedURIComponent(JSON.stringify(params)); // 生成URL `/search?c=${compressed}` // 解压过程 const decompressed = JSON.parse(LZString.decompressFromEncodedURIComponent(cParam)); ``` **效果对比**: 原始长度:287字符 → 压缩后:89字符(节省69%) --- ### 四、注意事项 1. **编码问题**:中文字符需使用`encodeURIComponent` 2. **安全性**:敏感参数应加密而非简单压缩 3. **兼容性**:部分旧设备可能不支持某些压缩算法 4. **调试难度**:压缩后参数难以直接阅读 --- ### 五、适用场景 1. 前端需要传递复杂嵌套参数时 2. 移动端H5页面需要缩短分享链接 3. 需要隐藏参数具体含义的场景 4. 大数据量分页/筛选条件传递 通过合理选择压缩方式,可以在保持功能完整性的同时显著优化URL的可读性和传输效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值