ruoyi 框架发布在docker中,传参出现乱码问题的解决办法
Posted 诸法空性
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ruoyi 框架发布在docker中,传参出现乱码问题的解决办法相关的知识,希望对你有一定的参考价值。
应项目所需,使用了若依微服务版,在windows下运行正常,在deepin中运行也正常,但是一发布到华为云的cce里面,就出问题了,页面输入的参数出现了乱码。
下面就解决过程做个记录,供自己和大家参考。
1、问题检测
初步怀疑,可能是接收环境的问题,因为在linux操作系统里面文件名、参数出现乱码这些问题都很常见,但是因为当前使用的若依版本是微服务版,从ui到业务后端,需要经过权限模块、网关、系统服务三道门槛的检验,所以面对的第一个难题时到底码错在哪里了?
于是先使用postman来测定问题出现在哪一步的转码没有成功。
用postman模拟参数,访问主服务,也就是nginx里面访问的那个转接的主服务地址,发现日志里面输出的没有问题,说明主业务服务里面没有乱码的道理。
然后,使用postman访问ui转向的地址。发现乱码了。
所以问题可能在gateway里面。
查看代码,发现在gateway里面,若依用xss检验的时候,需要把原来的请求里面的参数进行转码,防止攻击。代码如下:
private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange)
ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest())
@Override
Docker中执行Shell出现乱码
问题描述
最近遇到一个问题:
执行命令 docker exec f4af9b sh -c ‘bash /tmp/build.sh‘
命令在docker中执行shell,会出现中文乱码的问题。但是在docker容器中单独执行shell脚本却没有出现乱码。查看环境变量存在LANG=en_US.UTF-8
,因此从原理上来说是不应该出现乱码的。
但是既然出现了乱码,那么LANG=en_US.UTF-8
应该就没有读取到,于是在 build.sh
中运行env
命令,发现通过docker exec f4af9b sh -c ‘bash /tmp/build.sh‘
方式没有LANG=en_US.UTF-8
环境变量,那么原因是什么?
原因定位
原因如下:
docker exec f4af9b sh -c ‘bash /tmp/build.sh‘
对于docker 容器来说是非登录和非交互式shell,这样就不会读取某些配置文件,导致LANG=en_US.UTF-8
没有加载成功。
Linux Shell
下面介绍一下Linux交互式和非交互式shell、登录和非登录shell之间的区别。
- 交互式shell(interactive shell)和非交互式shell(non-interactive shell):
- 交互式的shell会有一个输入提示符,并且它的标准输入、输出和错误输出都会显示在控制台上。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。
- 非交互式shell是
bash script.sh
这类的shell。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就终止了。
- 交互式的shell会有一个输入提示符,并且它的标准输入、输出和错误输出都会显示在控制台上。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。
- 登录式shell(login shell)和非登陆式shell(no-login shell):
- 需要输入用户名和密码的shell就是登陆式shell。因此通常不管以何种方式登陆机器后用户获得的第一个shell就是login shell。不输入密码的ssh是公钥打通的,某种意义上说也是输入密码的。
- 非登陆式的就是在登陆后启动bash等,即不是远程登陆到主机这种。
对于常用环境变量设置文件,整理出如下加载情况表:
文件 | 非交互+登陆式 | 交互+登陆式 | 交互+非登陆式 | 非交互+非登陆式 |
---|---|---|---|---|
/etc/profile | 加载 | 加载 | - | - |
/etc/bashrc | 加载 | 加载 | - | - |
~/.bash_profile | 加载 | 加载 | - | - |
~/.bashrc | 加载 | 加载 | 加载 | - |
BASH_ENV | - | - | - | 加载 |
执行脚本,如bash script.sh
是属于non-login + non-interactive。
解决思路
因而,执行命令docker exec f4af9b sh -c ‘bash /tmp/build.sh‘
对于docker容器来说是属于non-login + non-interactive。
将上面的bash /tmp/build.sh
改为bash --login /tmp/build.sh
变为登录shell,就可以读取/etc/profile和~/.bash_profile等文件。
或者在执行bash /tmp/build.sh
时在build.sh
加入export LANG="en_US.UTF-8"
手动设置。
常见的shell变量
PATH:决定了shell将到哪些目录中寻找命令或程序
HOME:当前用户主目录
MAIL:是指当前用户的邮件存放目录。
SHELL:是指当前用户用的是哪种Shell。
HISTSIZE:是指保存历史命令记录的条数
LOGNAME:是指当前用户的登录名。
HOSTNAME:是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。
LANG/LANGUGE:是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。
PS1:是基本提示符,对于root用户是#,对于普通用户是$。
PS2:是附属提示符,默认是">"。
!-->以上是关于ruoyi 框架发布在docker中,传参出现乱码问题的解决办法的主要内容,如果未能解决你的问题,请参考以下文章