get请求传入[ ]这类字符 返回400错误解决

文章讲述了在高版本Tomcat中,由于严格遵循RFC3986规范,GET请求包含[,]等特殊字符会导致400错误。解决方案包括切换到POST请求、降低Tomcat版本或修改Tomcat配置允许这些字符,以及对URL参数进行encodeURI编码。示例代码展示了如何修改GET请求方法以处理这个问题。

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

问题描述

使用get请求查询,传入特殊字符 []时,接口报错。

在这里插入图片描述

分析原因

高版本的tomcat,有个新特性:

严格按照RFC 3986规范进行访问解析,而 RFC3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。

因为get请求会将参数拼接在url之后,故参数中包含’[‘、’]'字符就会返回400。

解决办法

  • 把get请求改成post请求
  • 使用低版本的tomcat
  • 继续用高版本的tomcat,修改tomcat配置
    (…/conf/catalina.properties中,找到最后注释掉的一行 #tomcat.util.http.parser.HttpParser.requestTargetAllow=|  ,改成tomcat.util.http.parser.HttpParser.requestTargetAllow=|{},表示把{}放行)
  • 对请求进行编码,拼在url后面的参数,先用encodeURI()转义

这里使用的第4种,因为项目中使用的是统一的get请求方法,故只需要修改get方法即可(拷来的,我是后端!!!)

get(url, params) {
    let _params
    if (Object.is(params, undefined)) {
      _params = ''
    } else {
      _params = '?'
      for (const key in params) {
        if (params.hasOwnProperty(key) && params[key] !== null) {
          _params += `${key}=${params[key]}&`
        }
      }
    }
    _params = encodeURI(_params)
    return service.get(`${url}${_params}`)
  },
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值