java.lang.IllegalArgumentException: Invalid character found in the request target. The valid charact

280 阅读1分钟

 最近公司升级框架,把之前基于springboot 1.x 的springcloud 升级到基于springboot2.x 的springcloud遇到一个问题:

一个接口请求报400错误

查看日志错误信息:

[2019-03-22 16:29:29.210] [INFO] 22312 --- [io-18501-exec-1] [o.apache.coyote.http11.Http11Processor  ] : Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
	at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:479)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)

由于是框架升级,肯定不是传参的问题,通过日志发现是tomcat 对于http头的验证 ,不支持数组传参 如:[]格式,查资料还有说不支持:{}|等格式。

解决办法,手动添加支持的类 ,代码如下 :

package com.hcmony.web;

import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Configuration;

/**
 * <h3>Shenjue.java基本描述</h3>
 * <p></p>
 *
 * @author hcmony
 * @since V1.0.0, 2019/03/22 16:22
 */
@Configuration
public class TomcatWebServerCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
	/**
	 * Customize the specified {@link WebServerFactory}.
	 *
	 * @param factory the web server factory to customize
	 */
	@Override
	public void customize(TomcatServletWebServerFactory factory) {
		factory.addConnectorCustomizers(connector -> connector.setAttribute("relaxedQueryChars", "{}[]|"));
	}
}

添加完,访问成功!