问题1:yml中配置的值加载到代码后值变了。
现场yml配置如下:
java
type-maps:
infos:
data_register: 0
ns_xzdy: 010000
ns_zldy: 020000
ns_yl: 030000
ns_jzjz: 040000
ns_ggglyggfwjz: 050000
ns_syffyjz: 060000
ns_gyjz: 070000
ns_ccywljz: 080000
ns_qtjz: 090000
服务会根据拿到的分类代码查找对应的分类名称。项目组反馈前端传080000可以拿到分类名称,但是前端传060000的时候却拿不到值,很是奇怪。使用线上诊断神奇arthas看了一眼,大吃一惊:
这配置加载的不对劲。
一通查找发现是因为YML规范的问题:
在Spring Boot应用中,当你尝试从
application.yml
文件中读取一个值,并且该值是一个以01
开头的数字,可能会遇到问题。YAML 1.2 规范允许以0
开头的数字被解析为八进制(Octal),但是如果数字包含8
或9
,则会导致解析错误,因为八进制数系统不包含这些数字。
这也就解释了为什么080000可以,060000不可以。 因为00-07开头的都会被以8进制的方式解析,这就是上午4096等数字的由来。
解决办法:
如果你需要保持该数字为八进制,确保其余部分只包含
0
到7
的数字。如果你需要保留这个值作为字符串,可以在YAML配置中使用双引号将值包裹起来,这样Spring Boot会将其当作字符串处理,不会尝试转换为数字。 例如:
问题2:spring boot服务通过nginx代理后获取不到准确的IP。
现场服务要求使用加密传输,于是使用nginx代理成https转发给后台。结果后台通过
request.getRequestURL()
拿到的请求还是http的,导致业务处理有问题。
又是一通查找发现首先nginx要配置转发请求协议:
proxy_set_header X-Forwarded-Proto $scheme;
完整的nginx配置如下:
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
然后在后台服务的yml添加配置:
server: forward-headers-strategy: native # 自动处理请求转发问题
即可自动获取到前端发起的请求地址。