GET请求参数中文乱码的解决办法

POST请求参数中文乱码,一般使用编码拦截器就可以解决,但是GET请求是地址栏传参,这些配置就没办法解决了。而java项目一般部署在tomcat上,第一种方式就是修改tomcat的配置文件,达到中文乱码的问题,如下:

<!-- 修改前 -->
<Connector port="9090" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

<!-- 修改后 -->
<Connector port="9090" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UFT-8" />

这种方式对于本地测试,或者部署拥有shell权限的服务器,是比较简单的,但是遇到购买web空间的站点,修改起来就没有那么容易啦,当然,你也可以选择tomcat 8及其以上的服务器空间;这些服务器默认解码方式是UTF-8。
即使是这样,有时候,我们也不想用户直接看到用户地址栏中存在一大串的中文,这样体验也不好。如果你有这样的需求,那么下面这种这样将是一个比较好的实现方式:

js请求数据前做编码处理

<script>
	// 这里要看清,两次encodeURI(),第一次将字符串转换为十六进制,第二次,修改转移符号(%)
	window.location.href = 'localhost:8080/dev/main?name' + encodeURI(encodeURI("小明"));
</script>

java后台接收参数处理

// 接收参数
String name = request.getParameter("name");
// 将接收到的参数做decode转换,还原(%)的转移字符,并以UTF-8进行解码字符串
name = URLDecoder.decode(name, "UTF-8");

如果我们有很多种种问参数这样传参,是不是很麻烦呢;如果你使用了springMVC,那么你可以注册一个自定义参数解析器,解析参数的时候,直接进行URI转换,并赋值。

这样是解决后端接收的问题了,但是前端呢?如果你使用可ajax的工具,例如axios等一些工具,也可以在请求拦截器中,重新对请求的参数进行编码

总结

URLDecoder和URIencode是比较简单的解决方式,但是真正做到项目时,我们未必能想得到,因为我们使用大量的框架,最直接的解决方式一般会去想框架有没有解决。

encodeURI和decodeURI

encodeURL函数主要是来对URI来做转码,它默认是采用的UTF-8的编码.
UTF-8编码的格式:一个汉字来三个字节构成,每一个字节会转换成16进制的编码,同时添加上%号.

假设我们传参为“中国”,这解码方式如下
1.第一次encodeURI,按照utf-8方式获取数组[-28, -72, -83, -27, -101, -67],其中前三个为“中”,后三个为“国”;遍历数组,将数组转化为16进制[E4, B8, AD, E5, 9B, BD],最后添加上百分号[%E4, %B8, %AD, %E5, %9B, %BD],现在已经分解为单字节符。

2.第二次encodeURI,进行编码,这是会处理%号这个转义字符。不处理%以外的字符,他会把%编码为%25,这样数组就变成了最终的[%25E4, %25B8, %25AD, %25E5, %259B, %25BD],然后提交服务器。

3.服务器调用getParameter拿到请求参数为[%25E4, %25B8, %25AD, %25E5, %259B, %25BD],服务器会使用URLDecode进行处理;第一次处理不管是按照UTF-8,还是GBK,还是ISO-8859的格式编码的,都会得到[%E4, %B8, %AD, %E5, %9B, %BD],因为这一次只对%进行去转移符;然后再使用UTF-8解码一次,就得到我们的中文字符了。

猜你喜欢

转载自blog.csdn.net/qq_35530330/article/details/86678324