问题说明:在银河麒麟服务器操作系统使用TongWeb做为应用服务器,使用达梦数据库做数据库服务器部署应用时,出现了前台提交的中文数据在后台获取到的是乱码的情况导致客户端验证异常,经过排查客户端数据提交时候中文并未乱码,确实是在后台获取到时才乱码的。
处理思路:一个项目出现后台获取到中文乱码的情况,一般是由于编码不统一或者是使用的编码是不支持中文的,如果发生后台数据接受的数据是乱码则要考虑的几个方面:
1.客户端页面编码,
2、提交的时候的数据是否有出现乱码,
3、后台接收时候设置的是编码,
4、使用的应用服务器上的编码设置,
5、服务器的编码设置。
这几个地方的编码设置应该是一致的比如都设置成utf-8并且是支持中文的utf8编码。
本次经过确认客户端提交的数据没有出现乱码,所以要考虑后台的情况。
我们先查看了银河麒麟服务器操作系统上的情况:
通过locale命令查看时发现:使用的是en_US.UTF-8 这种情况下 对于中文的支持肯定是会有问题的
这里有个坑要稍微注意一下:往常我们修改linux服务器locale 是修改的/etc/sysconfig/i18n这个文件,网上大多数资料说如果没有这个文件是新建一个,然后source /etc/sysconfig/i18n 使其立即生效,然后再查询locale时 发现 改过来啦:
但是你reboot服务器之后会发现:我是设置了个寂寞么?!重启之后 /etc/sysconfig/i18n 的设置失效了! 所以 这里这种设置方式是没有用的!
对此,我们需要寻找另外的方式,根据麒麟官方说法:装系统的时候默认装了中文安装包了就直接改配置就行,没安装中文安装包,需要先安装,才有效。至于如何确认可以通过 locale -a命令或者是locale -a |grep zh_CN
查询到这样的内容就表示原本是支持中文的,这样我们直接修改/etc/locale.conf即可
修改完/etc/locale.conf 重启服务器即可。
这里我使用的是华为的云服务器时是使用的提供的镜像,所以我不太知道原本是否是安装了中文语言包的,并且我在修改
/etc/sysconfig/i18n之前是使用了yum install :
所以我不确定原来是否有zh_CN的相关支持,大家不妨做个验证。
后来会发现即使正确的设置了服务器本身的支持语言编码之后,还是乱码。 后来想起:还有个TongWeb应用服务器没有设置呢!
经过确认发现:TongWeb本身的默认编码是GBK,所以必然会出现问题啊!
设置方法如下:
点击TongWeb管理控制台菜单时的【WEB容器设置】--【容器配置】在容器配置页面设置:【默认请求参数解码字符集】以及【默认应答编码字符集】为UTF-8。
除此之外,在HTTP项目还需要设置【WEB容器配置】下的【HTTP通道管理】
一般情况下项目部署好之后是采用的默认8088的端口,因此我们去配置8088这个HTTP通道:
将对应HTTP通道的【其他设置】的【URL编码格式】设置为UTF-8。避免含中文的URL出现乱码。
设置TongWeb的编码之后,重启启动TongWeb ,银河麒麟服务器操作系统TongWeb在安装时默认目录为:/opt/TongWeb/ 转到bin目录下,先./stopserver.sh停止应用服务器 然后再./startservernohup.sh 以后台方式启动服务器避免前台启动时出现的ssh断开之后服务器就断开的情况。
然后发现 提交的中文数据 后台获取不再是乱码啦!!!