经过XssFilter替换特殊字符后再经zuul路由转发httpEntity缺少内容

一.问题描述

  前端post方式提交,content-type类型为application/json,提交到网关之后,再经zuul路由转发到相应的服务,但是发现在提交的内容中如果包含括号"("时,经网关转发后的内容会被截短,后端服务无法解析json,从而报出异常信息。

二.问题原因

  经wireshark抓包分析,请求在post到网关时是正常的,但是括号会被替换成&#09字符,而再经过网关中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方法。

参考文档:

经过zuul添加或修改请求参数

 

posted @ 2021-11-29 22:13  八方鱼  阅读(293)  评论(0编辑  收藏  举报