多部分请求表后编码Apache

时间:2019-05-24 08:19:38

标签: apache spring-boot encoding utf-8 multipartform-data

UTF-8编码以多部分形式存在一些问题。默认设置-application/x-www-form-urlencoded可以正常工作。

我们具有以下结构:

  

浏览器-> WebServer(Apache)-> AppServer(Spring Boot / w Zuul用于路由)-> ...

我们提交了多份表格enctype="multipart/form-data",大部分没有文件。这是浏览器的外观(示例表单):

Form example

这是数据在Spring App中的显示方式

SystemOut     O DEFAULT ENCODING >>> UTF-8 ///request.getCharacterEncoding() 
SystemOut     O Request HEADER Name - Content-Length, Value - 254
SystemOut     O Request HEADER Name - Cache-Control, Value - max-age=0
SystemOut     O Request HEADER Name - Upgrade-Insecure-Requests, Value - 1
SystemOut     O Request HEADER Name - Content-Type, Value - multipart/form-     data; boundary=----WebKitFormBoundaryk2QfSBFSnZZ4om4N
SystemOut     O Request HEADER Name - User-Agent, Value - Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
SystemOut     O Request HEADER Name - Accept, Value - text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
SystemOut     O Request HEADER Name - Accept-Encoding, Value - gzip, deflate, br
SystemOut     O Request HEADER Name - Accept-Language, Value - de,en-US;q=0.9,en;q=0.8
SystemOut     O Request HEADER Name - Front-End-Https, Value - on


SystemOut     O Request PARAMETER  Name - password, Value - Value_????
SystemOut     O Request PARAMETER  Name - username, Value - Key_??????

带有“ ???”是原始字符。

我们在UTF8Filter中定义了一个用于调试的过滤器(web.xml,上面显示了Sysout):

<!-- Set UTF-8 before request.getParameter() is called -->
    <filter>
        <filter-name>UTF8Filter</filter-name>
        <filter-class>something.UTF8Filter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>UTF8Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

我们也尝试了org.springframework.web.filter.CharacterEncodingFilter中的web.xml

我们正在使用:

  • spring-boot 1.5.19。发布
  • spring-cloud-starter-netflix-zuul 1.4.1。发布

Apache为2.4,并设置了AddDefaultCharset utf-8。此外,Web服务器(Linux)的语言环境已定义为utf-8。

问题是,如何解决/分析(并修复)这个问题?

注意:
这与讨论的here-FormHttpMessageConverter.MultipartHttpOutputMessage#getAsciiBytes(String)不同,因为数据在到达{{1}之前已在链中的第一个过滤器(UTF8Filter)中被“破坏”。 }}。至少这是日志和调试所建议的。

0 个答案:

没有答案