• 经过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添加或修改请求参数

  • 相关阅读:
    php json_encode怪问题
    给phpcms v9添加热门搜索关键词
    magento 1.6 后台无法登录解决办法
    08 baidu QA
    java exception
    java thread / process / thread runnable / thread sleep / thread run
    java reflect
    db sysbase
    内存单元
    分段的方式来管理内存
  • 原文地址:https://www.cnblogs.com/bayu/p/15621770.html
Copyright © 2020-2023  润新知