UTF-8编码以多部分形式存在一些问题。默认设置-application/x-www-form-urlencoded
可以正常工作。
我们具有以下结构:
浏览器-> WebServer(Apache)-> AppServer(Spring Boot / w Zuul用于路由)-> ...
我们提交了多份表格enctype="multipart/form-data"
,大部分没有文件。这是浏览器的外观(示例表单):
这是数据在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
。
我们正在使用:
Apache为2.4,并设置了AddDefaultCharset utf-8
。此外,Web服务器(Linux)的语言环境已定义为utf-8。
问题是,如何解决/分析(并修复)这个问题?
注意:
这与讨论的here-FormHttpMessageConverter.MultipartHttpOutputMessage#getAsciiBytes(String)
不同,因为数据在到达{{1}之前已在链中的第一个过滤器(UTF8Filter
)中被“破坏”。 }}。至少这是日志和调试所建议的。