远程服务使用 ISO-8859-15 编码的请求调用我们的 Jetty 服务器。这个特殊请求被映射到 Spring 控制器上。 Jetty 无法以正确的方式对请求进行编码,并显示以下异常:
exception=org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: Not valid UTF8! byte F6 in state 3}
org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: Not valid UTF8! byte F6 in state 3
at org.eclipse.jetty.util.Utf8Appendable.appendByte(Utf8Appendable.java:168) ~[na:na]
at org.eclipse.jetty.util.Utf8Appendable.append(Utf8Appendable.java:93) ~[na:na]
at org.eclipse.jetty.util.UrlEncoded.decodeUtf8To(UrlEncoded.java:506) ~[na:na]
at org.eclipse.jetty.util.UrlEncoded.decodeTo(UrlEncoded.java:554) ~[na:na]
at org.eclipse.jetty.server.Request.extractParameters(Request.java:285) ~[na:na]
at org.eclipse.jetty.server.Request.getParameter(Request.java:695) ~[na:na]
....
Solution
在 Spring 中,即使整个应用程序都使用 UTF-8,也可以通过 CharacterEncodingFilter 强制对请求进行编码。异常应该消失。
<filter>
<filter-name>encoding-filter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>ISO-8859-15</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding-filter</filter-name>
<url-pattern>/app/specialRequest.do</url-pattern>
</filter-mapping>
如果这不适合你
- 找出远程系统编码
- 启动Wireshark通过 ip.src == xxx.xxx.xxx.xxx 过滤器分析传入的包
- 在请求正文中搜索特殊字符(将十六进制值重新计算为二进制,并尝试几种常用的编码以准确找到与异常匹配的编码)
-
通过 Jetty 的 start.ini 设置编码。具有以下参数
Dorg.eclipse.jetty.util.URI.charset=ISO-8859-15
Dorg.eclipse.jetty.util.UrlEncoding.charset=ISO-8859-15
如果您还有其他问题,请给我留言。
看起来客户端正在发送应编码为 UTF8 的文本,但并未对其进行编码。
为了正确诊断此问题,您需要了解 UTF8(您可能会这样做,我不知道)
在 UTF8 中,编码为 127 (0x7F) 或更小的任何字符 -i.e.仅使用最低 7 位 - 包含在流中as is(无特殊编码)。但任何大于 127 的值(即设置至少比第 7 位高一位)都会被特殊编码。
0xF6
大于0x7F
因此,如果客户端想要发送该字符,则应该对其进行编码。
0xF6
二进制是11110110
,在 UTF8 中应该是11000011 10110110
(C3 B6
)
因此,如果客户端想要发送 ISO8859-1 字符 0xF6,那么它应该发送 UTF8 字节序列 0xC3 0xB6。
您确实需要弄清楚客户端想要发送什么、该数据采用什么字符集/编码,以及为什么在发送之前不将其转换为有效的 UTF8。
(“状态3”,与Jetty的内部表有关,用于进行UTF8解码,它对于诊断这个问题并不是很有帮助。只有当你找到客户端时它才会派上用场,并且看起来客户端正在做正确的事情的事情,并且你怀疑 Jetty 的 UTF8 解码是错误的)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)