Интернационализированные свойства страницы в Tapestry 4.1.2

StackOverflow https://stackoverflow.com/questions/43199

Вопрос

Страница входа в мое приложение 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"/>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top