【问题标题】:UTF-8 encoded j_security_check username incorrectly decoded as Latin-1 in Tomcat realmUTF-8 编码的 j_security_check 用户名在 Tomcat 领域被错误地解码为 Latin-1
【发布时间】:2015-02-13 13:18:16
【问题描述】:

我正在调查在登录表单中引入带有 Latin-1 字符的用户名的问题。 用户名包含字符á。 我调查了我拥有的服务器部分:

public class MyRealm 扩展 RealmBase 实现 Realm { 公共主体身份验证(字符串用户名,字符串密码){ ... 此处实现的实际身份验证 } }

如果我打印出字节:username.getBytes() 我看到字符 á 有:C3 83 C2 A1 通常 UTF8 编码中的字符 á 应该有:C3 A1。 如果我再次用 UTF8 编码,我会得到:C3 83 C2 A1 我的软件打印出来的内容。

我在网络捕获中检查了用户名是通过 C3 A1 正确发送的。 登录页面表单源代码为:

        <form name="loginForm" action="j_security_check" method="post" enctype="application/x-www-form-urlencoded">
        <table>
            <tr>
                <td colspan="2" align="right">Secure connection:
                    <input type="checkbox" name="checkbox" class="style5" onclick="javascript:httpHttps();"></td>
            </tr>
            <tr>
                <td class="style5">Login:</td>
                <td><input type="text" name="j_username" autocomplete="off" style="width:150px" /></td>
            </tr>

所以我认为客户端没有问题(2 次 UTF8 转换)。 如果我在 authenticate() 函数中将用户名从 UTF8 解码两次,则身份验证工作正常, 但我害怕将此解决方案应用于我的问题

我应该在 Realm 的 authenticate(String username, String password) 函数中的哪里查找用户名的这种编码? 服务器端在带有 httpd-2.2.15 和 tomcat6-6.0.24 的 linux (RedHat) 上运行。

【问题讨论】:

    标签: tomcat utf-8 character-encoding j-security-check


    【解决方案1】:

    在您的示例中,您的表单使用 % 编码将 'á' 的 UTF-8 字符发送到 Tomcat(因此通过线路它是 %C3%A1)。但是 Tomcat 会将其解释为 Latin1,这是 POST 的默认编码。

    所以 Tomcat 会在内部将 C3A1 存储为 'á',因为 C3 是 'Ã' 而 A1 在 Latin1 编码中是 '¡'。

    当您询问 username.getBytes() 时,它会创建一个 UTF-8 编码的字节数组,因此它会在 UTF-8 字符集中(即 C383 C2A1)查找“á”这两个字符。

    详细描述此问题的常见问题解答和建议的解决方案: http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q3

    更改server.xml中FormAuthenticator的Valve指定characterEncoding="UTF-8"

        <Context path="/YourSercureApp">
                <Valve
                className="org.apache.catalina.authenticator.FormAuthenticator"
                disableProxyCaching="false"
                characterEncoding="UTF-8" />
        </Context>
    

    【讨论】:

    • 欢迎来到 Stack Exchange,感谢您的帮助。理想情况下,答案中的解决方案应该是独立的,代码在这个站点上 - 而不是在链接中。这样一来,我们就不必担心网站重组时链接断开的问题,并且明年会有同样问题的人访问 stackoverflow。
    猜你喜欢
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2014-11-11
    • 2018-12-11
    • 1970-01-01
    相关资源
    最近更新 更多