URL 传参编码&解码

以前做好的一个页面,突然被告知乱码了,当时吓一跳,好在没有影响线上数据,于是找出原因,以前开发项目几乎全是在火狐上测试使用的,然后今天早上找了一下,发现火狐不报错,其他浏览器报错,于是用IE试了一下,果真就乱码了再见


条件如下:

url参数中有中文有英文,有数字,由于懒,就不对URL 进行编码了 ,其他的不会受到影响,于是就只把中文的参数进行了编码,传到后台使用C#进行解码。

先科普一下它的家人们:

JavaScript中编码方法有:escape、encodeURI、encodeURIComponent

C#中编码主要方法有:HttpUtility.UrlEncode、Server.UrlEncode、Uri.EscapeUriString、Uri.EscapeDataString

escape:

对ASCII符号编码

encodeURI

对于网址编码,不包含参数

encodeURIComponent

对参数进行编码

------------------------------------------------------------------------------------------------------------------------------------------------------------------

以下是使用方法:

var strUrl = "TradeDate?country=" + encodeURIComponent(country) + "&countryEn=" + countryEn + "&startTime=" + sDate + "&endTime=" + eDate + "&pi=" + viewmodel.pageIndex() + "&pz=" + viewmodel.pageSize();

这里country 国家是中文参数 ,于是在传值的时候先进行编码,到了后台,C#部分代码是这样获取的:

string newCountry = HttpUtility.UrlDecode(country, Encoding.GetEncoding(936));

引用的是using System.Text;

UrlDecode(String, Encoding)该方法是用来对指定编码对象将URL编码的字符串转换为已解读的字符串。

代码页
Name 显示名称
936
gb2312 简体中文 (GB2312)
65001
utf-8 Unicode (UTF-8)

因为我们传过来的是简体中文,所以指定解码方案的 Encoding 用936。

注*:

如果在 HTTP 流中传递如空格和标点字符,它们可能会错误地解释在接收端。  URL 编码转换为字符实体等效项; 不允许在 URL 中的字符URL 解码反转的编码。  例如,在嵌入到要在 URL 中,字符传输的文本块中 < 和 > 编码为 %3 c 和 %3e。

若要对 Web 应用程序之外的值进行编码或解码,请使用 WebUtility 类。


以上。


&lt;think&gt;嗯,用户问的是如何通过URL传递参数以及常见问题和解决方案。首先,我得回顾一下URL传参的基本方法。记得URL参数通常是附加在路径后面,用问号分隔,键值对用等号连接,多个参数用&amp;符号分开,比如?name=John&amp;age=30。这部分应该没问题,但可能需要举例说明。 然后,用户可能遇到哪些问题呢?比如中文乱码,因为URL默认编码可能不支持中文,需要用到encodeURIComponent或者decodeURIComponent来处理。比如引用[1]提到用URLSearchParams获取参数,这可以解决部分问题,但可能需要更详细的步骤。还有日期参数的传递,引用[3]提到Java中传递日期的问题,可能需要建议将日期转为ISO字符串或者时间戳,避免格式问题。 另一个常见问题是参数丢失或截断,特别是特殊字符如&amp;或#,这时候必须正确编码,避免被解析错误。比如在PHP中用urlencode,JS中用encodeURIComponent。引用[5]提到的uni-app路由传参参数丢失,可能涉及框架自身的问题,需要建议使用框架提供的API或全局事件通信。 还有跨平台或框架的问题,比如Vue或React中的路由传参,可能需要使用特定的方法如params或query,而不是直接拼接URL。比如引用[4]中的layui传参,用全局变量可能不够可靠,建议使用框架推荐的方式。 此外,不同后端处理方式不同,比如Spring MVC中@RequestMapping默认支持多种方法,但URL参数只支持GET,需要明确指定方法,如引用[2]提到的。可能还要提到POST等其他方法不适合URL传参。 安全问题也是要考虑的,比如敏感信息不应在URL中传递,容易被日志或浏览器历史记录截获。建议使用POST或加密,但用户的问题可能更关注技术实现,这部分可以简要提及。 总结下来,需要分步骤讲解传参方法,然后列出常见问题,每个问题对应解决方案,并引用相关的参考资料。需要确保语言口语化,避免技术术语堆砌,让用户容易理解。同时,注意用户提供的引用材料,正确关联到问题中,比如中文乱码对应引用[1],日期问题对应引用[3],框架问题对应引用[4]和[5],方法限制对应引用[2]。 最后,生成相关问题时要围绕URL传参的扩展,比如性能分析、优化方法、应用场景等,但根据用户提供的示例,可能包括编码必要性、特殊字符处理、不同框架传参方式、参数大小限制和安全性等。需要确保问题具有针对性,帮助用户深入理解。&lt;/think&gt;### 如何通过URL传递参数及常见问题解决方案 #### 一、URL传参的基本方法 1. **基础语法** URL参数通过`?`附加在路径后,格式为`键=值`,多个参数用`&amp;`分隔。例如: `https://example.com?name=John&amp;age=30` 2. **动态生成参数** 在JavaScript中,可以使用`URLSearchParams`对象或`encodeURIComponent`函数编码参数,避免特殊字符冲突[^1]。 ```javascript let params = new URLSearchParams({ name: &quot;张三&quot;, date: &quot;2023-10-01&quot; }); let url = `https://example.com?${params.toString()}`; ``` 3. **后端接收参数** 不同框架解析方式不同: - **Java Spring**:通过`@RequestParam`注解获取参数[^3]。 - **Node.js**:使用`querystring`模块解析URL参数。 --- #### 二、常见问题及解决方案 1. **中文乱码** **问题**:中文字符未编码导致乱码。 **解决**:使用`encodeURIComponent`编码,后端对应解码[^1]。 ```javascript let name = encodeURIComponent(&quot;张三&quot;); // 编码 let decodedName = decodeURIComponent(urlParams.get(&quot;name&quot;)); // 解码 ``` 2. **日期参数传递** **问题**:日期格式解析错误或丢失。 **解决**:传递ISO标准格式(如`2023-10-01T12:00:00Z`)或时间戳。 ```java // Java示例:接收日期参数 @GetMapping(&quot;/event&quot;) public ResponseEntity&lt;?&gt; getEvent(@RequestParam(&quot;date&quot;) @DateTimeFormat(iso = ISO.DATE) LocalDate date) { // 业务逻辑 } ``` 3. **参数丢失或截断** **问题**:参数中包含`&amp;`、`#`等特殊字符导致截断。 **解决**:严格编码所有参数,避免保留字符冲突。 ```javascript let param = encodeURIComponent(&quot;key=value&amp;test=1&quot;); // 输出 key%3Dvalue%26test%3D1 ``` 4. **跨平台/框架参数传递** **问题**:某些框架(如uni-app、layui)因路由机制导致参数丢失。 **解决**: - **uni-app**:使用`uni.$emit`和`uni.$on`全局事件通信[^5]。 - **layui**:通过父页面全局变量或`localStorage`传递参数[^4]。 5. **GET方法限制** **问题**:URL参数仅支持GET请求,且长度受限(通常不超过2048字符)。 **解决**: - 敏感数据改用POST请求。 - 超长参数拆分为多个请求或使用`POST + Body`[^2]。 --- #### 三、安全建议 1. **敏感信息避免URL传参** URL参数可能被浏览器历史记录或服务器日志截获,需加密或使用HTTPS。 2. **参数校验** 后端需对参数类型、范围做严格校验,防止SQL注入或非法访问。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值