解决springboot项目请求接口无效字符问题 Invalid character found in the request target.

转载自:https://www.cnblogs.com/saltiest/p/11213976.html

解决springboot项目请求出现非法字符问题 java.lang.IllegalArgumentException:Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

springboot版本: 2.1.5

最近使用springboot搭建了一个App后台服务的项目,开发接口的时候在本机使用postman工具做请求测试,请求返回一直很正常,但是在前端开发使用h5请求后台服务的时候,前台请求400,浏览器提示请求跨域

但是我在提供接口请求的入口处做了跨域处理的,如图:

所以我考虑可能不是跨域问题,查看ide控制台发现每次请求都会报如下错误:

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

org.apache.coyote.http11.AbstractHttp11Processor process

信息: 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.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:283)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1017)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1524)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1480)

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)
 

这段报错的意思是:请求中含有无效字符,有效的字符在RFC 7230和RFC 3986中定义

出现这个错误的原因是:我们在前后台交互的时候往往使用json格式的字段串参数,其中含有“{}”“[]”这些特舒符号,在高版本的tomcat中含有这些字符的请求会被拦截

查看springboot项目的tomcat版本:

方法一:使用idea作为开发工具的可以直接点击项目下面External Libraries,搜索字符串“tomcat”

 

可以看到tomcat版本为9.0.19

方法二:打开本地maven仓库springboot父依赖配置,路径如:C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-dependencies

我是2.1.5版本的springboot,打开2.1.5.RELEASE文件夹查看 spring-boot-dependencies-2.1.5.RELEASE.pom 里面的配置 搜索tomcat.version,显示<tomcat.version>9.0.19</tomcat.version>

这就是springboot所依赖的tomcat的版本

解决办法:

1.降低tomcat版本(不推荐),将tomcat版本改到tomcat8.5以下,但是我并不推荐这种办法,因为你以后的开发迟早要使用更新的版本,所以怎么修改tomcat版本我就不介绍了

2.在springboot工程中增加一个tomcat 配置,或者将webServerFactory方法加入到springboot启动类中,配置文件代码如下:

/**
 * @author: zw
 * @create: 2019-06-27 11:19
 **/
@Configuration
public class TomcatConfig {

    @Bean
    public TomcatServletWebServerFactory webServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addConnectorCustomizers((Connector connector) -> {
                connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}");
                connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}");
        });
        return factory;
    }
}

在方法中我们加入了 \"<>[\\]^`{|}这些符号,问题就这么完美的解决了

### 回答1: Tomcat在处理请求目标时发现了无效字符。有效的字符包括字母、数字和一些特殊符号。一旦请求中包含了无效字符,Tomcat将无法正确解析请求,导致出现错误。 无效字符是指那些不被HTTP协议允许出现在请求目标中的字符。例如,某些特殊符号和非ASCII字符可能被认为是无效字符。其中一个被提到的无效字符是“a”。 如果碰到这个错误,您可以考虑以下解决方案: 1. 检查请求目标中是否存在无效字符。可以使用ASCII字符集中允许的字母、数字和一些特殊符号,如连字符或斜杠。 2. 检查请求目标中是否存在非ASCII字符。如果存在,可以尝试将其转换为相应的ASCII字符或使用URL编码来处理。 3. 检查URL中是否存在空格或其他不允许的字符。如有需要,可以使用URL编码来替换这些字符。 4. 检查请求目标中是否存在其他错误。无效字符错误可能是由其他问题引起的。检查其他相关信息,如请求头和请求体,以寻找可能的错误。 总之,当在Tomcat中遇到“invalid character found in the request target”的错误时,应该仔细检查请求目标中是否包含无效字符,并采取适当的措施来解决问题。 ### 回答2: Tomcat报错"invalid character found in the request target. the valid characters"意思是在请求目标中发现了无效字符,有效字符包括a。 这个错误通常发生在使用Tomcat服务器时,客户端发起了一个带有无效字符请求。在URL中,请求目标代表要请求的资源的路径。例如,以GET方法请求http://example.com/my-page时,"my-page"就是请求目标。 Tomcat服务器对请求目标中的字符有一些限制。根据HTTP/1.1规范,请求目标只能包含ASCII字符,并且某些字符需要进行转义。如果在请求目标中发现了无效字符,就会出现这个错误。 在错误信息中提到的有效字符"a"指的是ASCII字符中的字母"a"。根据HTTP/1.1规范,字母"a"是允许在请求目标中使用的有效字符之一。 要解决这个错误,可以检查请求中的URL是否包含了无效字符。确保请求目标只包含ASCII字符,并将其中的无效字符进行转义。可以使用URL编码来确保请求目标中的特殊字符正确转义。 例如,如果请求目标中包含了非ASCII字符,可以使用URL编码将其转换为%xx的格式。对于字母"a",由于它是有效字符,所以不需要进行特殊处理。 总之,当在Tomcat服务器中出现"invalid character found in the request target. the valid characters"的错误时,需要检查请求目标中是否包含了无效字符,并对其进行相应的转义处理,确保请求目标只包含ASCII字符。 ### 回答3: Tomcat invalid character found in the request target问题的原因是在请求目标中存在无效字符。在Tomcat中,请求目标是指HTTP请求中URL中的路径部分。根据HTTP协议,请求目标只能包含特定的有效字符。 有效字符是指被允许在URL中使用的字符,包括字母(大小写),数字以及一些特殊字符,如连字符(-)、下划线(_)、点号(.)等。 然而,为了确保请求的安全性和可靠性,Tomcat对请求目标进行了严格的检查和验证。如果在URL中的请求目标中发现无效字符,Tomcat会拒绝处理该请求,并返回"invalid character found in the request target"错误。 在这种情况下,解决方法是确保请求目标中只包含有效的字符。你提到的有效字符是字母"a",所以可以查看请求目标中是否包含了其他无效字符。 通常情况下,无效字符可能是由URL编码错误引起的。URL编码是一种将特殊字符转换为URL安全字符的方法。对于包含非ASCII字符的URL,应该使用适当的URL编码方法。 另外,如果你使用的是Web应用程序框架,例如Spring MVC,也可能是在生成URL时出现了编码问题。在此情况下,建议检查URL生成的代码,确保使用了正确的URL编码机制。 总之,要解决Tomcat invalid character found in the request target问题,需要检查并确保请求目标中只包含有效字符,并正确处理URL编码。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值