Tomcat问题解决:Invalid character found in the request target.

浏览器访问后端接口报HTTP Status:400 Bad Request错误。解决方案方面,Tomcat7和Tomcat8可修改%TOMCAT_HOME%/conf/catalina.properties文件,取消最后一行注释,添加tomcat.util.http.parser.HttpParser.requestTargetAllow=| ;Tomcat6不支持该配置;更高版本未测试,推测可能兼容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

浏览器端在访问后端的接口,报了错误HTTP Status:400 Bad Request,后台日志如图所示:

解决方案:

1. Tomcat7 和 Tomcat8可以通过修改%TOMCAT_HOME%/conf/catalina.properties 文件从而让容器支持URL中带有“|”符号,取消最后一行的注释。内容:tomcat.util.http.parser.HttpParser.requestTargetAllow=| ,如图所示:

2. Tomcat6则没有这个配置,小编试了下,即使在对应的配置文件中加上这行配置,也没有作用,应该是tomcat6不支持这个配置吧

3. 更高版本的Tomcat,小编还没有去down下来,所以也没有去测试,不过感觉高版本应该会兼容这个配置的

 

### Java HTTP 请求中 `IllegalArgumentException` 异常问题解决方案 当遇到 `java.lang.IllegalArgumentException: Invalid character found in the request target` 错误时,通常是因为请求的目标路径或参数包含了不符合标准的字符。这些字符违反了 RFC 7230 和 RFC 3986 的规定[^1]。 #### 原因分析 该错误的主要原因是客户端发送的 HTTP 请求中存在非法字符。具体来说: - 非法字符可能存在于 URL 路径、查询参数或头部字段中。 - 特定版本的服务器(如 Tomcat 8.5.x)对请求目标中的字符进行了更严格的校验[^4]。 - 如果 Cookie 中包含非法字符(例如 ASCII 控制字符),也可能触发此异常[^2]。 #### 解决方案 以下是几种常见的解决方法: 1. **编码处理** 对于传递的数据(特别是 JSON 字符串或其他复杂数据结构),应确保其经过适当的编码。可以使用 `URLEncoder.encode()` 方法来转义特殊字符。 ```java String encodedParam = URLEncoder.encode(paramValue, StandardCharsets.UTF_8.toString()); ``` 2. **调整 Tomcat 配置** 如果问题是由于 Tomcat 默认严格解析模式引起的,则可以通过修改配置文件降低解析严格度。编辑 `server.xml` 文件并设置以下属性: ```xml <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" relaxedQueryChars=&#39;|,<,>,`,{,},[,],",\\&#39; relaxedPathChars=&#39;|,<,>,`,{,},[,]," /> ``` 这里通过指定允许的额外字符集缓解部分兼容性问题。 3. **验证输入数据** 在接收任何外部输入之前增加一层过滤逻辑,剔除潜在危险字符。例如: ```java public static boolean isValidRequest(String input) { Pattern pattern = Pattern.compile("[^a-zA-Z0-9]"); Matcher matcher = pattern.matcher(input); return !matcher.find(); } ``` 4. **升级依赖组件** 若当前使用的框架或者库较旧,可能存在未修复的相关漏洞。建议及时更新至最新稳定版以获得更好的支持[^3]。 以上措施能够有效减少甚至完全消除此类运行期异常的发生概率。 ```java // 示例代码展示如何安全构建URL try { StringBuilder urlBuilder = new StringBuilder("http://example.com/api?"); Map<String, String> params = Map.of( "key1", "value with space", "key2", "another=value&more" ); for (Map.Entry<String, String> entry : params.entrySet()) { urlBuilder.append(URLEncoder.encode(entry.getKey(), "UTF-8")) .append("=") .append(URLEncoder.encode(entry.getValue(), "UTF-8")) .append("&"); } System.out.println(urlBuilder.substring(0, urlBuilder.length() - 1)); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e.getMessage(), e); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值