前段html通过js拼接url?name=XXX&gender=XXX,然后调用jQuery的ajax,往后台传参数,前端alert参数是正常的,后端的参数是乱码

本文探讨了使用GET请求传递中文参数时出现乱码的问题,分析了GET与POST请求的区别,并给出了通过更改请求方式来解决乱码的具体方案。

前段html通过js拼接url?name=XXX&gender=XXX,然后调用jQuery的ajax,往后台传参数,前端alert参数是正常的,后端的参数是乱码,怎么办?

name参数,“中国”变成了“中国”


原因:

从http请求报文的角度分析原因:

1因为是get请求所导致(什么是get请求?即将参数放在url?name=XXX&type=XXX的后面),这样浏览器是不会对参数进行UrlEncode编码的

如果是post请求(form表单中的值、jQuery的ajax的data参数,都是post请求),则参数不会出现这个问题,因为浏览器会对所有参数(仅仅对参数进行编码,其他的都不变,包括?前面的,=前面的)进行UrlEncode编码

UrlEncode编码前:

如http://127.0.0.1:8080/testProject/test/getSearchResult?name=Tom&gender=男

UrlEncode编码后:

http://127.0.0.1:8080/testProject/test/getSearchResult?name=Tom&gender=%E7%94%B7

(?前面的,=前面的都不编码,英文也保持原样,不编码)

2一般的研发框架,如spring mvc、struts、jfinal等,都会提供获取参数的方法如this.getPara("Name"),这些方法其实否是框架封装过的,是经过UrlEncode码的。

既然发现了问题,那么就在前段,通过js即jQuery对中文参数人工进行UrlEncode编码不就行了,仅仅需要一段代码。




然而结果还是不行,我改变了一种传参的方式,即将get方式,换成post方式,瞬间就行了。所以,最好不用、最好绝对不用get方式,要用post方式






### ### URL递多个同名参数的合法性 在 HTTP 协议中,允许在 URL递多个同名参数,例如 `/Servlet?name=java&name=mysql`,这种写法是合法的。当浏览器将请求发送到服务器时,服务器会将这些同名参数的值以数组或列表的形式接收。 在 Servlet 中,可以通过 `request.getParameterValues("name")` 方法来获取所有名为 `name` 的参数值,返回的是一个字符串数组 `String[]`。如果使用 `request.getParameter("name")`,则只会获取第一个值,后续值会被忽略。 例如,在 Servlet 中可以这样处理: ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String[] names = request.getParameterValues("name"); if (names != null) { for (String name : names) { System.out.println("接收到的参数值:" + name); } } } ``` 因此,URL `/Servlet?name=java&name=mysql` 是一种标准的请求方式,适用于需要递多个相同参数名称的场景,如多选框提交等[^1]。 ### ### 参数递的适用场景 当需要递多个相同名称的参数时,使用 URL 拼接多个同名参数是一种常见做法。例如,用户在前端选择多个兴趣标签,提交到后端进行处理: ``` http://example.com/interests?interest=music&interest=sports&interest=reading ``` 在后端 Servlet 中,可以通过 `getParameterValues()` 获取所有选中的兴趣标签,从而进行进一步的业务处理。 ### ### 注意事项 虽然 URL 中允许递多个同名参数,但在实际开发中应根据具体需求选择合适的方式。如果参数数量较多或参数值较大,建议使用 POST 请求,避免 URL 长度过长导致兼容性问题或被服务器截断。 此外,某些前端框架或库在发送请求时可能会自动合并或去重同名参数,因此在前后端联调时应确保参数递方式的一致性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值