Frage

Die Anmeldeseite in meiner Tapestry-Anwendung verfügt über eine Eigenschaft, in der das vom Benutzer eingegebene Kennwort gespeichert wird, das dann mit dem Wert aus der Datenbank verglichen wird.Wenn der Benutzer ein Passwort mit Multibyte-Zeichen eingibt, wie zum Beispiel:

áéíóú

...eine Überprüfung des Rückgabewerts von getPassword() (der abstrakten Methode für die entsprechende Eigenschaft) ergibt:

áéíóú

Offensichtlich ist das nicht richtig codiert.Dennoch meldet Firebug, dass die Seite in UTF-8 bereitgestellt wird, sodass vermutlich auch die Anfrage zur Formularübermittlung in UTF-8 codiert wäre.Die Überprüfung des aus der Datenbank stammenden Werts ergibt die korrekte Zeichenfolge, sodass es nicht den Anschein hat, als handele es sich um ein Problem mit der Betriebssystem- oder IDE-Kodierung.Ich habe den Standardwert von Tapestry für org.apache.tapestry.output-encoding in der .application-Datei und in Tapestry 4 nicht überschrieben Dokumentation gibt an, dass der Standardwert für die Eigenschaft UTF-8 ist.

Warum scheint Tapestry die Kodierung beim Festlegen der Eigenschaft zu verfälschen?

Es folgt der relevante Code:

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>

Loginseite

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

Aktualisierung

@Jan Soltis:Nun, wenn ich den aus der Datenbank stammenden Wert überprüfe, wird die richtige Zeichenfolge angezeigt, sodass es den Anschein hat, dass mein Editor, mein Betriebssystem und meine Datenbank den Wert alle korrekt codieren.Ich habe auch meine .application-Datei überprüft;es enthält keinen org.apache.tapestry.output-encoding-Eintrag und den Tapestry 4 Dokumentation gibt an, dass der Standardwert für diese Eigenschaft UTF-8 ist.Ich habe die Beschreibung oben aktualisiert, um die Antworten auf Ihre Fragen widerzuspiegeln.

@ich selbst:Lösung gefunden.

War es hilfreich?

Lösung 2

Ich habe das Problem gefunden.Tomcat hat die Parameter verstümmelt, bevor Tapestry oder meine Seitenklasse es überhaupt geschafft haben.Durch das Erstellen eines Servlet-Filters, der die gewünschte Zeichenkodierung erzwingt, wurde das Problem behoben.

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>

Andere Tipps

Alles scheint korrekt zu sein.

Bist du wirklich sicher getPassword() gibt Müll zurück?Ist es nicht jemand anderes (Ihr Editor, Ihr Betriebssystem, Ihre Datenbank usw.), der nicht weiß, dass es sich um eine Unicode-Zeichenfolge handelt, wenn er sie Ihnen anzeigt, während das Passwort möglicherweise völlig in Ordnung ist?Was genau Lässt Sie denken, dass es Müll ist?

Ich würde auch sicherstellen, dass in der .application-Konfigurationsdatei keine seltsame Codierung festgelegt ist

<meta key="org.apache.tapestry.output-encoding" value="some strange encoding"/>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top