问题
The valid characters are defined in RFC 7230 and RFC 3986
url
GET localhost:6666/testPath?testp=te|st
查询结果看是因为客户端发送请求使用了GET请求,同时参数中携带有“|”
HTTP/1.1 有一些对请求头的规定
HTTP/1.1 specification
Tomcat文档官网
解决
最初尝试使用gateway全局过滤器解决该问题
但是仔细研究后发现,该异常在请求到达过滤器前就已经抛出,所以无法使用过滤器解决,于是就找到了Tomcat提出的参数解决
@Bean
fun servletContainer(): ConfigurableServletWebServerFactory {
val factory = TomcatServletWebServerFactory()
factory.addConnectorCustomizers(TomcatConnectorCustomizer { connector: Connector? ->
// 设置relaxedQueryChars和relaxedPathChars
// 注意:这些属性在Tomcat的Connector中没有直接的setter方法,因此需要通过反射来设置
try {
// relaxedQueryChars
val relaxedQueryCharsField =
Connector::class.java.getDeclaredField("relaxedQueryChars")
relaxedQueryCharsField.setAccessible(true)
relaxedQueryCharsField[connector] = "[]|{}^\\&\"'<>"
// relaxedPathChars
val relaxedPathCharsField =
Connector::class.java.getDeclaredField("relaxedPathChars")
relaxedPathCharsField.setAccessible(true)
relaxedPathCharsField[connector] = "[]|{}^\\&\"'<>"
} catch (e: Exception) {
throw RuntimeException(e)
}
})
return factory
}
可经过尝试发现依旧解决不了
测试方案在gateway使用无效,普通服务未测试!
尚未解决该问题!!!
提供几种其他解决方案(何苦为难自己!)
找前端,修改传参,删除特殊字符
找前端,修改传参,使用URL编码然后传参
还是找前端,修改发送请求方式,暂时看的话,除了GET请求都好使