【问题标题】:Character encoding in request.getRemoteUser()request.getRemoteUser() 中的字符编码
【发布时间】:2021-02-26 08:07:42
【问题描述】:

每个请求都通过 Microsoft IIS 和一个 AJP13 连接器连接到 Tomcat。一些用户名包含德语特殊字符。如果用户名为“Kloß”,request.getRemoteUser() 返回“KloÃ?”。在 Tomcats localhost_access_log 中,用户名正确记录为“Kloß”。

如何将request.getRemoteUser() 的返回值转换为UTF-8 字符串?

我试过没有成功:

String s1 = request.getRemoteUser()
String s2 = org.apache.commons.codec.binary.StringUtils.newStringUtf8(request.getRemoteUser().getBytes())

【问题讨论】:

  • 你试过new String(s1.getBytes(), "utf-8");吗?
  • 谢谢!我试过这个。结果与 String s2 中的结果相同
  • 你的访问日志编码是什么?我猜它是 ISO-8859-1。
  • 访问日志为UTF-8。 “ß”编码为 C3 9f

标签: java tomcat servlets request character-encoding


【解决方案1】:

我认为您需要了解getRemoteUser() 的编码方式。

在纯 UTF-8 系统上我执行了这个:

    String name = "Kloß";
    System.out.printf("%x%n", new BigInteger(1, name.getBytes()));

打印出来的

    4b6c6fc39f
  /*K l o ß   */

c39f 输入到 fileformat.info 上的搜索中,我们发现它是 utf-8 十六进制表示形式的 LATIN SMALL LETTER SHARP S

所以用你的request.getRemoteUser() 执行上面的 printf 并尝试找出你的ß 是哪个字符集。如果请求来自 Windows 机器,我猜它的“CP1252”。

【讨论】:

  • 谢谢!我创建了一个新用户。名字是“äöüß”。您上面的代码在日志中打印了以下内容:“c3a4c3b6c3bcc33f”。 c3a4 = ä, c3b6=ö, c3bc=ü。这是 UTF-8。但是 c33f 是什么?
  • @PosNerd 'c33f' 不是一个,而是两个字符:C3 = Ã3F = ?。这意味着那时已经为时已晚:有人已经转换了您的字符串。您必须在更远的上游搜索。也许以某种方式注销 IIS 的输出?
  • IIS 和 AJP1.3 连接器运行良好。 Tomcat 将用户名正确写入自己的 localhost_access_log。 Tomcat 内部的某些东西破坏了“ß”。我想它不打算支持用户名中的特殊字符。我尝试了使用 tomcatAuthentication 和 tomcat-users.xml 的特殊字符。它根本不起作用。
  • 似乎是一个已知问题,也许这会有所帮助? support.microfocus.com/kb/doc.php?id=7011206
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多