Интернационализированные свойства страницы в Tapestry 4.1.2
-
09-06-2019 - |
Вопрос
Страница входа в мое приложение Tapestry имеет свойство, в котором сохраняется пароль, введенный пользователем, который затем сравнивается со значением из базы данных.Если пользователь вводит пароль, состоящий из многобайтовых символов, таких как:
áéíóú
...проверка возвращаемого значения getPassword() (абстрактный метод для соответствующего свойства) дает:
áéÃóú
Очевидно, что это закодировано неправильно.Тем не менее, Firebug сообщает, что страница обслуживается в UTF-8, поэтому, предположительно, запрос на отправку формы также будет закодирован в UTF-8.Проверка значения по мере его поступления из базы данных выдает правильную строку, так что, по-видимому, это не проблема с кодировкой операционной системы или IDE.Я не переопределил значение по умолчанию Tapestry для org.apache.tapestry.output-encoding в файле .application и Tapestry 4 Документация указывает, что значением по умолчанию для свойства является UTF-8.
Итак, почему Tapestry, похоже, нарушает кодировку при настройке свойства?
Ниже приведен соответствующий код:
Login.html
<html jwcid="@Shell" doctype='html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"' ...>
<body jwcid="@Body">
...
<form jwcid="@Form" listener="listener:attemptLogin" ...>
...
<input jwcid="password"/>
...
</form>
...
</body>
</html>
Логин.страница
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE page-specification
PUBLIC "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
"http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
<page-specification class="mycode.Login">
...
<property name="password" />
...
<component id="password" type="TextField">
<binding name="value" value="password"/>
<binding name="hidden" value="true"/>
...
</component>
...
</page-specification>
Login.java
...
public abstract class Login extends BasePage {
...
public abstract String getPassword();
...
public void attemptLogin() {
// At this point, inspecting getPassword() returns
// the incorrectly encoded String.
}
...
}
Обновления
@Ян Солтис:Что ж, если я проверю значение, полученное из базы данных, оно отобразит правильную строку, так что может показаться, что мой редактор, операционная система и база данных правильно кодируют значение.Я также проверил свой файл .application;он не содержит записи org.apache.tapestry.output-encoding и Tapestry 4 Документация указывает, что значением по умолчанию для этого свойства является UTF-8.Я обновил приведенное выше описание, чтобы отразить ответы на ваши вопросы.
@я сам:Решение найдено.
Решение 2
Я нашел проблему.Tomcat искажал параметры еще до того, как Tapestry или мой класс page смогли с этим справиться.Создание фильтра сервлетов, который применял желаемую кодировку символов, исправило это.
CharacterEncodingFilter.java
package mycode;
import java.io.IOException;
import javax.servlet.*;
/**
* Allows you to enforce a particular character encoding on incoming requests.
* @author Robert J. Walker
*/
public class CharacterEncodingFilter implements Filter {
private static final String ENCODINGPARAM = "encoding";
private String encoding;
public void init(FilterConfig config) throws ServletException {
encoding = config.getInitParameter(ENCODINGPARAM);
if (encoding != null) {
encoding = encoding.trim();
}
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding(encoding);
chain.doFilter(request, response);
}
public void destroy() {
// do nothing
}
}
web.xml
<web-app>
...
<filter>
<filter-name>characterEncoding</filter-name>
<filter-class>mycode.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncoding</filter-name>
<url-pattern>/app/*</url-pattern>
</filter-mapping>
...
</web-app>
Другие советы
Вроде бы все правильно.
Это ты действительно уверен getPassword() возвращает мусор?Разве это не кто-то другой (ваш редактор, операционная система, база данных, ...), который не знает, что это строка в юникоде, когда он отображает ее вам, в то время как пароль может быть в полном порядке?Что именно так заставляет тебя думать, что это мусор?
Я бы также убедился, что в конфигурационном файле .application нет странной кодировки
<meta key="org.apache.tapestry.output-encoding" value="some strange encoding"/>