Spring 的 ISO-8859 请求上的 Jetty Utf8Appendable$NotUtf8Exception

2024-04-14

远程服务使用 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(使用前将#替换为@)

Spring 的 ISO-8859 请求上的 Jetty Utf8Appendable$NotUtf8Exception 的相关文章

  • 读外国文字

    我有一个包含英超足球运动员姓名的数据库 我正在将其读入 R 3 02 但当涉及到姓名中含有外来字符 元音变音 重音符号等 的球员时 我遇到了困难 下面的代码说明了这一点 PlayerData lt read table C Users Do
  • 根据请求创建 Hibernate-Session

    我刚刚启动了一个简单的 Java 测试项目 它使用 Hibernate 管理一些实体 并提供 REST 接口来操作这些对象并提供一些额外的业务逻辑 REST 接口是使用 RESTEasy 和 Jetty 创建的 到目前为止 一切工作正常 但
  • JavaScript 中的奇怪字符导致其无法加载

    我的网站在本地主机上运行良好 我的 JavaScript 正在加载并运行良好 但是当我部署站点时 脚本不起作用 当我右键单击页面并说查看源代码 然后查看链接的脚本文件时 文件开头有一些奇怪的字符 函数 在本地主机上 我的脚本文件像这样开始
  • 如何对加密算法进行逆向工程?

    我编写了一个以这种方式加密文本的应用程序 获取输入文本 反转文本 转换为十六进制 用密钥进行异或 Base64编码 现在 我自己没有做很多加密 编码 所以我的问题可能听起来很愚蠢 但是 假设我得到一个包含上述算法内容的文件 而我不知道这个算
  • 如何在执行 apache HttpPost 时将 UrlEncodedFormEntity 中的空格编码为 %20?

    我正在访问的网络服务需要 URLEncodedFormEntity 形式的参数 我无法根据 Web 服务的要求将空间更改为 20 而是将空间转换为 我的代码是 HttpClient client new DefaultHttpClient
  • 将数字字符引用符号转换为 unicode 字符串

    是否有一个标准的 最好是 Pythonic 的方法来转换 xxxx 正确的 unicode 字符串的表示法 例如 1502 1508 1490 1513 1497 应转换为 使用字符串操作可以很容易地完成它 但我想知道是否有一个标准库可以实
  • 如何在 readr/tidyverse 中设置编码/文件编码选项? [复制]

    这个问题在这里已经有答案了 我有一个旧光谱仪的文本文件 它以 UTF 16LE 编码 我用readr guess encoding 功能 我设法在 base r 中读取它 spectra gr2 lt read csv some path
  • 启动jetty服务器时出现NoClassDefFoundError

    我正在尝试在码头服务器中托管我的网络应用程序 spring 我将 war 文件复制到 jetty 服务器中的 webapp 文件夹中 我并不是想嵌入jetty服务器 而是试图在jetty内托管应用程序 如tomcat 我没有安装jetty
  • JavaScript blob 编码为 UTF-8 而不是 ANSI

    我使用 JavaScript blob 创建一个 FDF 文件 该文件打开并填充本地存储的 PDF 但是 本地存储的 PDF 的文件路径包含重音字符 并且我无法编辑文件夹名称 当文件夹路径不包含重音符号时 此代码有效 并且如果我在记事本中打
  • Java 中非 ASCII 字符的 URL 解码

    我正在尝试用 Java 解码包含 编码字符的 URL 我尝试使用 java net URI 类来完成这项工作 但它并不总是正常工作 String test https fr wikipedia org wiki Fondation Alli
  • 是否有将二进制数据打包成 UTF-16 字符串的标准技术?

    在 NET中 我有任意二进制数据存储在byte 例如图像 现在 我需要将该数据存储在string 旧 API 的 注释 字段 有没有标准技术packing将此二进制数据转换为string 我所说的 打包 是指对于任何相当大且随机的数据集 字
  • 如何在 Jetty Web 服务器中部署 JSP 文件?

    我创建了一个简单的 JSP 文件 我想将其部署在 Jetty 7 2 中 Jetty 正在运行 我可以看到默认网页 http localhost 8080 我用 Jetty 启动java jar start jar命令 我保存了简单的 JS
  • 通过 JavaScript 获取页面/iframe 的编码

    我想通过 JavaScript 或浏览器中的其他一些 API 以编程方式确定页面的编码 我想要这些信息的原因是因为我试图对主要浏览器支持的字符编码进行模糊测试 显然仅仅因为我发送了适当的 内容类型 并不意味着浏览器会使用编码做正确的事情 欢
  • Android 上的 Jetty 上的 Jersey 抛出 ContainerException:“不存在 WebApplication 提供程序”

    我正在尝试在 Android 上的 Jetty 上运行 Jersey 我创建了一个 Android 它使用 Jersey Servlet 实例化 Jetty 服务器 无论如何 当我启动 Jetty 并访问 REST 资源时 在我的例子中 h
  • ASIHTTPRequest:检测到不正确的 NSStringEncoding 值 0x0000

    检测到不正确的 NSStringEncoding 值 0x0000 假设 NSStringEncodingASCII 将停止此兼容性映射行为 不久的将来 当我使用 ASIHTTPRequest 时 我不断收到此错误 50 的时间 这是怎么回
  • 如何在 Java/Eclipse 中使用特殊字符

    如何在 Java Eclipse 中使用 显示 或 等字符 当我尝试直接使用它们时 例如在源代码中 Eclipse无法保存文件 我能做些什么 编辑 如何找到 unicode 转义序列 问题是您使用的字符无法以文件设置的编码 Cp1252 表
  • Twitter Streaming API 使用的官方编码?是UTF-8吗?

    Twitter 流 API 的官方编码是什么 根据我所看到的 我最好的猜测是 UTF 8 但我想避免做出假设 我见过的 Twitter 网站上唯一暗示他们使用什么作为官方编码的部分是在这里 Twitter 不想因为我们使用 UTF 8 或相
  • Jetty、websocket、java.lang.RuntimeException:无法加载平台配置器

    我尝试在 Endpoint 中获取 http 会话 我遵循了这个建议https stackoverflow com a 17994303 https stackoverflow com a 17994303 这就是我这样做的原因 publi
  • Windows-1252 编码 - 显示不正确的字符

    我有一个缓冲区 其中包含以 Windows 1252 编码的字符 然而 当我使用适当的编码创建一个新的字符串时 我经常得到询问标记 而不是预期的结果 例如 byte tmps new byte byte 0xfb System out pr
  • Python - Unicode 到 ASCII 的转换

    我无法在不丢失数据的情况下将以下 Unicode 转换为 ASCII u ABRA xc3O JOS xc9 I tried encode and decode他们不会这么做 有人有建议吗 Unicode 字符u xce0 and u xc

随机推荐