Я исследую проблему, из-за которой имя пользователя с символом Latin-1 вводится в форму входа. Имя пользователя содержит символ á. Я исследую серверную часть, где у меня есть:
открытый класс MyRealm расширяет RealmBase, реализует Realm {public Principal authentication(строковое имя пользователя, строковый пароль) {... фактическая аутентификация реализована здесь} }
Если я распечатаю байты: 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). Если я два раза декодирую обратно из UTF8 в функции authentication(), имя пользователя, тогда аутентификация работает нормально, но я боюсь применять это решение к моей проблеме.
Где я должен искать эту кодировку имени пользователя в функции аутентификации Realm (строковое имя пользователя, строковый пароль)? Серверная часть работает на Linux (RedHat) с httpd-2.2.15 и tomcat6-6.0.24.