一.问题描述
前端post方式提交,content-type类型为application/json,提交到网关之后,再经zuul路由转发到相应的服务,但是发现在提交的内容中如果包含括号"("时,经网关转发后的内容会被截短,后端服务无法解析json,从而报出异常信息。
二.问题原因
经wireshark抓包分析,请求在post到网关时是正常的,但是括号会被替换成	字符,而再经过网关中zuul转发时,发出的包中httpEntity就被截短了。
经过仔细调试,发现被替换的字符是在xssFilter中,替换后的内容被重新包装成一个request对象,而zuul转发时有两种读取request中body的方式,一种是chunked的方式,一种是request的header中标识有content-length的方式,而标识有content-length的方式是从原始请求对象request的header中直接读取,那么因为提交的body内容再经过xssFilter处理后变成了一个包装好的新的request对象,其中的request的body内容包含括号,所以被替换为html编码字符,所以body的length就已经发生了变化,如果zuul转发过程中再通过原始请求的content-length来确定读取新包装后的request中的inputstream流信息,就不会读取完整。
三.解决方法
解决方法是在xssFilter替换request的类XssHttpServletRequestWrapper类中,override 重写 getContentLengthLong和getContentLength方法。
参考文档: