当前位置: 首页 > news >正文

开发避坑指南(23):Tomcat高版本URL特殊字符限制问题解决方案(RFC 7230 RFC 3986)

异常信息

java.lang.IllegalArgumentException: 在请求目标中找到无效字符[/order/show?orderType=01&orderTitle=0xe50x8f0xa30xe50xb20xb80xe50x8a0xa80xe60x800x81&pageNum=1 ]。有效字符在RFC 7230RFC 3986中定义org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:497)org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:492)org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:934)org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1698)org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)java.lang.Thread.run(Thread.java:748)

异常分析

这个错误通常出现在Tomcat服务器处理HTTP请求时,当请求URL或参数中包含不符合RFC 7230和RFC 3986规范的字符时抛出。主要问题原因有:

1、请求中包含未编码的中文字符

2、URL参数包含特殊符号(如[]{}等)

3、高版本Tomcat(8.5+)对URL字符校验更严格

本次异常就是因为URL中的orderTitle参数包含未编码的中文字符导致的。

解决办法

方案1

1、在tomcat安装路径中conf/catalina.properties文件中最后添加如下一行:

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}[],%

tomcat.util.http.parser.HttpParser.requestTargetAllow 是Tomcat高版本(8.5+)中用于放宽HTTP请求目标字符限制的关键配置参数,主要作用是允许特定特殊字符通过校验和解决Invalid character found in request target错误。默认情况下,Tomcat会严格遵循RFC 7230和RFC 3986规范,拒绝包含{}[]|\等特殊字符的请求。通过该参数可显式声明允许的字符集。

有的博客还建议加上org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true配置配合使用,该配置用于控制URL编码斜杠处理行为的关键系统属性。当设置为true时,Tomcat会允许URL中包含%2F(/的编码形式)和%5C(\的编码形式)的请求通过校验,默认情况下Tomcat会拒绝此类请求并返回400错误。而%2F容易导致安全性问题,所以建议保持默认不要开启。

2、在tomcat安装路径中conf/server.xml中的Connector节点中添加relaxedPathChars属性和relaxedQueryChars属性放宽URL字符校验:

<Connector relaxedPathChars="|{}[],%" relaxedQueryChars="|{}[],%"URIEncoding="UTF-8"/>

添加的2个属性用来接收任意特殊字符的组合,特殊符号包括但不限于:|{}[],%等。

relaxedPathChars‌用于指定URL路径部分(/path/to/resource)允许的特殊字符集,默认仅支持RFC规范的安全字符。通过配置可允许{}[]|等符号出现在路径中。

relaxedQueryChars‌用于控制查询字符串(?key=value&…)中的合法字符范围,常用于处理JSON参数或含特殊符号的GET请求。

注意:过度放宽字符限制可能引发安全攻击,建议仅对必要字符放行。

方案2

1、对URL中的中文参数进行编码后再传参。编码String encodedOrderTitle = URLEncoder.encode(orderTitle, “UTF-8”);解码java.net.URLDecoder.decode(encodedOrderTitle,“UTF-8”);

2、在tomcat安装路径中conf/server.xml中的Connector节点中增加URIEncoding=“UTF-8”。强制Tomcat在处理GET请求的URL参数(路径和查询字符串)时使用UTF-8解码,解决中文等非ASCII字符的乱码问题。

http://www.lryc.cn/news/619240.html

相关文章:

  • 一键设置 NTP 时区的脚本(亲测,适用于部署 K8S 的前置环境)
  • 数据结构:图
  • 终端安全与网络威胁防护笔记
  • Web 服务详解:HTTP 与 HTTPS 配置
  • 谷歌 Web Guide 如何重塑搜索排名及其 SEO 影响
  • AR眼镜新赛道:光波导与MicroOLED如何解决眩晕难题?
  • -bash: ll: 未找到命令
  • Python Day28 HTML 与 CSS 核心知识点 及例题分析
  • open Euler--单master部署集群k8s
  • C++联合体的定义
  • 六、SpringBoot多环境开发
  • 数据结构 二叉树(2)堆
  • 论区间dp:常用模型(附极角排序教程)
  • 计算机网络摘星题库800题笔记 第5章 传输层
  • 正则表达式解析(二)
  • mysql中的常见的索引类型及其特点
  • 前端css学习笔记3:伪类选择器与伪元素选择器
  • 开源!!! htop移植到OpenHarmony
  • 基于LLVM的memcpy静态分析工具:设计思路与原理解析(C/C++代码实现)
  • 实现文字在块元素中水平/垂直居中详解
  • tensorrt-llm0.20.0离线部署DeepSeek-R1-Distill-Qwen-32B
  • Apache POI中通过WorkBook写入图片后出现导出PDF文件时在不同页重复写入该图片问题,如何在通过sheet获取绘图对象清除该图片
  • 2787. 将一个数字表示成幂的和的方案数
  • 万物平台模型导入样例大全(实时更新中~)
  • 力扣面试150题--爬楼梯 打家劫舍 零钱兑换 最长递增子序列
  • 10. React组件间的通信
  • 某跨国金融机构法律法规自动文本摘要(ATS/文本大意提取)功能规划
  • Ansible 基础到实操笔记
  • scikit-learn/sklearn学习|岭回归python代码解读
  • 鸿蒙开发资源导航与学习建议