新发地网站建设客户管理软件有哪些
新发地网站建设,客户管理软件有哪些,建设银行官方网站个人系统板块修改,网站建设中如何兼容所有浏览器本文主要分享了#xff0c;SpringCloud Gateway网关在url参数带有空格或者特殊字符的情况下#xff0c;转发失败导致响应错误码400的解决方案。
响应400错误码的2种场景#xff1a;
1.参数带空格#xff0c;Gateway会误认为该空格是切割符#xff0c;如?phone 135****6…本文主要分享了SpringCloud Gateway网关在url参数带有空格或者特殊字符的情况下转发失败导致响应错误码400的解决方案。
响应400错误码的2种场景
1.参数带空格Gateway会误认为该空格是切割符如?phone 135****6862type44不能正常解析协议直接异常
2.参数带特殊字符如?phone|135****6862type44能正常解析协议但转发后异常 一、问题分析
1.可用性99的问题接口
质量组反馈的可用性文档中显示错误码4xx特别多如下图 2.排查
根据错误码匹配应用日志未发现异常日志
根据错误码匹配Gateway网关日志未发现异常日志
根据错误码匹配nginx日志发现异常日志基本都是响应400错误码
{clientip: 100.xxx.xxx.250,timestamp: 2024-01-03T00:52:1008:00,request_method: POST,response: 400,byte: 131,uri: /api/xxx/xxx/smsCode,param: phone 135****6862type44,referrer: -,agent: Mozilla/5.0 (Linux; U; Android 4.4.1; zh-cn; R815T Build/JOP40D) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/4.5 Mobile Safari/533.1,httpx_for: 221.xx.xx.60,http_host: domain.com,upstream_addr: 172.xxx.xxx.123:8280,request_time: 0.011,upstream_response_time: 0.010,ssl_protocol: -
}
3.分析
是由于请求参数带了空格phone 135****6862type44导致该空格非前端正常传参误操作是恶意请求初步怀疑是nginx转发问题因为网关未找到任何日志。经运维同事协助排查发现是Gateway网关响应的400错误码没有日志是因为日志级别没有设置到debug所以未打印。
4.排查与复现
问题复现测试用例 断点排查发现经过代码HttpObjectDecoder.splitInitialLine后将sb内容切割为一个3个元素的数组切割规则中空格就是其中一个切割符。
注意这里不能使用hutool http工具请求因为会对url进行urlencode无法复现效果 sb样本为
GET http://localhost:8280/api/xxx/xxx/smsCode?phone 135****6862 HTTP/1.1
数组样本为
[GET,http://localhost:8280/api/xxx/xxx/smsCode?phone,135****6862 HTTP/1.1]
后续代码中取第三个元素‘135****6862 HTTP/1.1’作为http协议转换导致异常所以响应400 二、解决方案
1.思路
想办法改写HttpObjectDecoder.splitInitialLine的逻辑上述情况数组样本为
[GET,http://localhost:8280/api/xxx/xxx/smsCode?phone135****6862,HTTP/1.1]
2.实现
经网络资料查询可以通过以下代码在Netty ChannelPipeline中添加ChannelHandler
经源码分析ChannelPipeline会有默认的http处理器NettyPipeline.HttpCodec其实现类为HttpServerCodec而HttpObjectDecoder.splitInitialLine的逻辑就是通过HttpServerCodec实现类来调用的
所以想办法替换NettyPipeline.HttpCodec的实现类即可 复制框架源码HttpObjectDecoder、HttpRequestDecoder、HttpServerCodec至项目目录中重命名加前缀Custom如下图 将这3个类Custom*中用到HttpObjectDecoder、HttpRequestDecoder、HttpServerCodec的地方全部修改为加Custom前缀的类如 修改CustomHttpObjectDecoder.splitInitialLine的逻辑
核心思想将sb按切割符切割出所有元素数组组装逻辑改为取第一个、取最后一个、中间部分拼接在一起 sb样本为
GET http://localhost:8280/api/xxx/xxx/smsCode?phone 135****6862 HTTP/1.1
list样本为
[GET,http://localhost:8280/api/xxx/xxx/smsCode?phone,135****6862,HTTP/1.1]
数组样本为
[GET,http://localhost:8280/api/xxx/xxx/smsCode?phone135****6862,HTTP/1.1]
保险起见非必要逻辑
1在异常情况下执行旧逻辑
2增加开关控制可通过apollo动态修改
3.url带特殊字符处理
某些情况下参数带特殊字符如下Gateway也会响应400
http://localhost:8280/api/xxx/xxx/smsCode?phone|135****6862
http://localhost:8280/api/xxx/xxx/smsCode?phone?135****6862
解决方案是增加UrlParamHandler获取url对其参数做urlencode
注意hutool工具的URLUtil.encodeQuery会对一些RSA加密的转换为空格需要用URLUtil.encodeAll或者java原生java.net.URLEncoder这2个又会把所有的路径参数、、之类的也转换所以下面写了个复杂的逻辑去获取参数值仅参数值做urlencode 怎么样如果你觉得有用的话还不快快收藏起来 附涉及的代码目录
github GitHub - 897665787/springcloud-template: 一个基于springcloud netflix微服务框架记录了关于微服务开发的一些最佳应用欢迎大家学习指导。
giteespringcloud-template: 一个基于springcloud netflix开发的脚手架记录了关于微服务开发中一些基础功能、通用功能的最佳设计欢迎大家学习、指导。
springcloud-template
└── template-gateway└── netty -- 日志配置└── CustomHttpObjectDecoder -- 复制于源码└── CustomHttpRequestDecoder -- 复制于源码└── CustomHttpServerCodec -- 复制于源码└── NettyWebServerCustomizer -- 配置初始化└── UrlParamHandler -- 使用urlencode替换特殊字符
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/90026.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!