坑!url中含有中文导致nginx 400。锅是tomcat的
不羡鸳鸯不羡仙,一行代码调半天。原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。
起因:用户在请求接口的时候,请求url
中携带中文参数,导致返回400
。查询日志发现报错:Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 。
原因:Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。【为了堵洞?(  ̄ー ̄)】
具体类的坐标:org.apache.tomcat.util.http.parser.HttpParser#IS_NOT_REQUEST_TARGET[]
大体意思就是,有以下字符都过不去(对应10进制ASCII看):
- 键盘上那些控制键:(<32或者=127)
- 非英文字符(>127)
- 空格(32)
- 双引号(34)
- #(35)
- <(60)
- >(62)
- 反斜杠(92)
- ^(94)
- TAB上面那个键(96)
- {(123)
- }(124)
这个问题碰到了其实还是很恶心的,业务肯定是改不动。提供5
个解决方法如下。
解决办法1
配置tomcat的catalina.properties
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
但这种方法只适合对应英文,如果为中文就不行。
如果有?和&这些符号,那么都得写进去。
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}?&
解决办法2
最简单粗暴方法,降低tomcat版本。此方法比较快,也不需修改配置。
解决办法3
对相应的参数进行编码,就是将所有的参数都进行urlencode。
解决方法4
选择另外的参数传递方法,比如post或者localStorage。
解决方法5
选择另外的容器,如jetty。不过配置文件需要修改,accesslog配置比tomcat麻烦。另:undertow也报400。
tomcat真贴心呀,给我找了一天的活。
作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。
后台回复“加群”,带你进入高手如云交流群
- 生物信息学技能面试题(第4题)-多个同样的行列式文件合并起来
- PHP 底层的运行机制与原理
- asp.net web api 版本控制
- 如何编写更好的SQL查询:终极指南(上)
- asp.net web api 异常捕获
- asp.net web api 文件上传
- 使用MySQL正则表达式 __MySQL必知必会
- 史上最好用的免费翻蔷利器
- asp.net web api 接口安全与角色控制
- TensorFlow从0到1 | 第十五章 重新思考神经网络初始化
- asp.net web api 下载之断点续传
- apache2.4.x三种MPM介绍
- 没有自己的服务器如何学习生物数据分析(上篇)
- 【直播】我的基因组57:最简陋的祖源分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 玩转 PhpStorm 系列(六):代码重构篇
- Java 反射
- python里运行shell命令或cmd命令
- 玩转 PhpStorm 系列(四):快捷键篇
- HDFS工作机制和原理
- 通过 PHP Mysqli 扩展与数据库交互
- python 中的元类详解
- 我扒了半天源码,终于找到了Oauth2自定义处理结果的最佳方案!
- python 解决多核处理器算力浪费的现象
- python实现单例模式的5种方法
- java序列化和序列化ID的作用
- python函数式编程
- 让Vim打造成强大的IDE,附_vimrc的配置和使用
- python 中面向切面编程AOP和装饰器
- HashMap&ConcurrentHashMap&HashTable