Domanda

La pagina di accesso nella mia applicazione Tapestry ha una proprietà in cui viene memorizzata la password digitata dall'utente, che viene poi confrontata con il valore del database.Se l'utente inserisce una password con caratteri multibyte, come ad esempio:

áéíóú

...un'ispezione del valore restituito di getPassword() (il metodo astratto per la proprietà corrispondente) fornisce:

áéíóú

Chiaramente, non è codificato correttamente.Tuttavia Firebug segnala che la pagina è pubblicata in UTF-8, quindi presumibilmente anche la richiesta di invio del modulo sarebbe codificata in UTF-8.L'ispezione del valore così come proviene dal database produce la stringa corretta, quindi non sembrerebbe essere un problema di codifica del sistema operativo o dell'IDE.Non ho sovrascritto il valore predefinito di Tapestry per org.apache.tapestry.output-encoding nel file .application e Tapestry 4 documentazione indica che il valore predefinito per la proprietà è UTF-8.

Allora perché Tapestry sembra alterare la codifica quando si imposta la proprietà?

Segue il codice pertinente:

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>

Pagina di login

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

Aggiornamenti

@Jan Soltis:Bene, se controllo il valore che proviene dal database, viene visualizzata la stringa corretta, quindi sembrerebbe che il mio editor, il sistema operativo e il database codifichino tutti il ​​valore correttamente.Ho anche controllato il mio file .application;non contiene una voce org.apache.tapestry.output-encoding e Tapestry 4 documentazione indica che il valore predefinito per questa proprietà è UTF-8.Ho aggiornato la descrizione sopra per riflettere le risposte alle tue domande.

@me stessa:Soluzione trovata.

È stato utile?

Soluzione 2

Ho trovato il problema.Tomcat stava alterando i parametri prima ancora che Tapestry o la mia page class ci riuscissero.La creazione di un filtro servlet che imponeva la codifica dei caratteri desiderata ha risolto il problema.

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>

Altri suggerimenti

Tutto sembra essere corretto.

Sei veramente sicuro getPassword() restituisce spazzatura?Non è qualcun altro (il tuo editor, sistema operativo, database, ...) che non sa che si tratta di una stringa Unicode quando te la mostra mentre la password potrebbe essere perfettamente a posto?Che cosa esattamente ti fa pensare che sia spazzatura?

Vorrei anche assicurarmi che non ci siano strane codifiche impostate nel file di configurazione .application

<meta key="org.apache.tapestry.output-encoding" value="some strange encoding"/>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top