Question

La page de connexion de mon application Tapestry possède une propriété dans laquelle le mot de passe saisi par l'utilisateur est stocké, qui est ensuite comparé à la valeur de la base de données.Si l'utilisateur saisit un mot de passe comportant des caractères multi-octets, tels que :

áéíóú

...une inspection de la valeur de retour de getPassword() (la méthode abstraite de la propriété correspondante) donne :

áéíóú

De toute évidence, ce n’est pas correctement codé.Pourtant, Firebug rapporte que la page est servie en UTF-8, donc vraisemblablement la demande de soumission du formulaire serait également codée en UTF-8.L'inspection de la valeur telle qu'elle provient de la base de données produit la chaîne correcte, cela ne semble donc pas être un problème d'encodage du système d'exploitation ou de l'IDE.Je n'ai pas remplacé la valeur par défaut de Tapestry pour org.apache.tapestry.output-encoding dans le fichier .application et Tapestry 4. Documentation indique que la valeur par défaut de la propriété est UTF-8.

Alors pourquoi Tapestry semble-t-il bâcler l'encodage lors de la définition de la propriété ?

Le code pertinent suit :

Connexion.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>

Page de connexion

<?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>

Connexion.java

...
public abstract class Login extends BasePage {
    ...
    public abstract String getPassword();
    ...
    public void attemptLogin() {
        // At this point, inspecting getPassword() returns
        // the incorrectly encoded String.
    }
    ...
}

Mises à jour

@Jan Soltis :Eh bien, si j'inspecte la valeur provenant de la base de données, elle affiche la chaîne correcte, il semblerait donc que mon éditeur, mon système d'exploitation et ma base de données codent tous correctement la valeur.J'ai également vérifié mon fichier .application ;il ne contient pas d'entrée org.apache.tapestry.output-encoding, et Tapestry 4 Documentation indique que la valeur par défaut de cette propriété est UTF-8.J'ai mis à jour la description ci-dessus pour refléter les réponses à vos questions.

@moi-même:Solution trouvée.

Était-ce utile?

La solution 2

J'ai trouvé le problème.Tomcat modifiait les paramètres avant même que Tapestry ou ma classe de page n'y parvienne.La création d'un filtre de servlet qui appliquait le codage de caractères souhaité l'a corrigé.

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>

Autres conseils

Tout semble être correct.

Es-tu vraiment sûr getPassword() renvoie des ordures ?N'est-ce pas quelqu'un d'autre (votre éditeur, OS, base de données,...) qui ne sait pas qu'il s'agit d'une chaîne Unicode lorsqu'il vous l'affiche alors que le mot de passe peut être parfaitement correct ?Quoi exactement ça te fait penser que c'est une poubelle ?

Je m'assurerais également qu'il n'y a pas de codage étrange défini dans le fichier de configuration .application

<meta key="org.apache.tapestry.output-encoding" value="some strange encoding"/>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top