Ajax get请求报400:java.lang.IllegalArgumentException: Invalid character found in the request target.

遇到这个问题一般是URL的不安全字符导致。请求中带有JSON格式的参数,参数中包含特殊字符,在tomcat8、tomcat9中,请求会被拦截,低版本tomcat则不会。

RFC 3986 文档

  1. RFC 3986文档规定,Url中只允许包含英文字母(a-z,A-Z)、数字(0-9)、- _ . ~ 4个特殊字符以及所有保留字符。
  2. RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ]

不安全字符

还有一些字符,当他们直接放在Url中的时候,可能会引起解析程序的歧义。这些字符被视为不安全字符,原因有很多。
1、空格,Url在传输的过程,或者用户在排版的过程,或者文本处理程序在处理Url的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉
2、‘’以及<>引号和尖括号通常用于在普通文本中起到分隔Url的作用
3、# 通常用于表示书签或者锚点
4、% 百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码
5、{ } | \ ^ [ ] ` ~ 某一些网关或者传输代理会篡改这些字符

 

根据网上找到的各种牛人的解决方案,总结了一下:

一、换到低版本的Tomcat(不推荐)

二、在Catalina.properties中添加

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

解析:在执行请求时,碰到该没问题的,大多是在URL中传输Json等。尤其是用浏览器地址输入的URL死活不能包含有任何特殊字符。否则会返回400 状态码。

首先:不推荐降低tomcat版本,这等于掩耳盗铃,绝对得不偿失。
Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,在http解析时做了严格限制。
RFC3986文档规定,请求的Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。

如果要使用这些特殊字符,并不是绝对不可以。Tomcat做了限制的同时,也提供了相关配置。给出的解决方案第一行requestTargetAllow,指定了允许的特殊字符,在等号后面配|{}就行了。

如果你仅需要使用这三个字符,配置到此就OK了。重启tomcat,rebuild工程再启动,就能正常使用了。

不幸的是, requestTargetAllow 只能配置|、{、} 允许这三个字符,对于其他的(例如" < > [ \ ] ^ ` { | } .),在请求时,仍然拦截,如果使用了|{}之外的其他字符那怎么办呢?那就还需要如下配置。

在conf/server.xml中的<Connector>节点中,添加2个属性:

relaxedPathChars="|{}[],"
relaxedQueryChars="|{}[],"
这2个属性,可以接收任意特殊字符的组合,根据需要可以自行增减。

三、在conf/server.xml中的<Connector>节点中添加

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               relaxedQueryChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;" />

 

参考文档:https://blog.csdn.net/ljheee/article/details/82051755

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值