Tomcat高版本中特殊字符问题 :java.lang.IllegalArgumentException: Invalid character found in the request target

post请求,请求中带有JSON格式的参数。在tomcat8.5.3、tomcat9中,请求会被拦截,在tomcat7.0.84中就不会。

JSON:

{

    "aaa": [758, 2392],

    "bbb": [755],

    "ccc": [760]

}

报错:

原因:

查了资料,大部分都说是新的标准中,请求不支持“{}”,但是把大括号转义之后还是出现同样的问题,后来把中括号转义后就可以了。找到问题的原因了:

由于json中带有“[]”,请求会被tomcat拦截。这个我有点不是很理解,按照RFC7230和3986中的定义,“[]”应该是保留字,不应该被拦截的。这个有点不懂了,没细看。

 

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

1.换到低版本的Tomcat(FNMDX!)

2.在Catalina.properties中添加

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

这个东西明显是允许“|”和大括号的,但是我现在的问题是中括号。

3.添加

tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

这个是允许url中带有特殊字符的。试过了,也不好使。

 

到这里似乎就卡住了。。。

 

 

晚上回到家,在老婆杀人的目光中,我还是战战兢兢打开了电脑。

准备再写几个bug,测试的时候,出现了一个错误:StackOverFlow

对!就是它了!!!!

由于英文实在太蹩脚,我就直接把错误提示粘贴到了搜索框中,之后找到了这么个页面:

https://stackoverflow.com/questions/41053653/tomcat-8-is-not-able-to-handle-get-request-with-in-query-parameters

这个是回答tomcat8不能在请求url中使用“|”的问题,然后略过了我已经试过的方法,找到了一个没有试过的

这哥们跟我遇到了同样的问题卧槽!!!!然后,我就试着在Server.xml的Connector中添加了这个

relaxedQueryChars="[,]"

牛逼了,好使了。而且,根据这哥们说的,如果还有其他特殊的字符串,可以直接添加到这个属性里。

 
————————————————
版权声明:本文为CSDN博主「MoriartyLiang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Hitler698/article/details/85720156

直至这里,还是基于tomcat来使用的,那么springboot又该如何该呢,其实就跟前面一样,给特殊字符放行,没有找到可以配置的,直接在启动类里面修改

现在,我们进入boot启动类,添加如下代码即可:

 

public class DemoApp {

    public static void main(String[] args) {

           SpringApplication.run(DemoApp.class, args);

    }

    @Bean

    public TomcatServletWebServerFactory webServerFactory() {

          TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();

          factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {

                            @Override

                            public void customize(Connector connector) {

                                   connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}");

                                   connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}");

                             }

            });

            return factory;

    }

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值