3 Stimmen

Spring MVC + Hibernate Kodierungsproblem

Ich arbeite an einer Spring MVC + Hibernate-Anwendung, verwende MySQL (Ver. 5.0.51a) mit dem InnoDB-Motor.

Das Problem tritt auf, wenn ich ein Formular mit kyrillischen Zeichen sende. Als Ergebnis enthält die Datenbank sinnlose Zeichen in unbekannter Codierung.

Alle JSP-Seiten, die Datenbank (+ Tabellen und Felder) wurden unter Verwendung von UTF-8 erstellt. Die Hibernate-Konfiguration enthält auch eine Eigenschaft, die die Codierung auf UTF-8 setzt.

Ich habe das gelöst, indem ich einen Filter erstellt habe, der den Anforderungsinhalt mit UTF-8 codiert. Beispielcode:

…
encoding = "UTF-8";
request.setCharacterEncoding(encoding);
chain.doFilter(request, response);
…

Aber das verlangsamt die App sichtbar.

Das Interessante ist, dass das Ausführen einer Insert-Abfrage direkt aus der App (d.h. Ausführen aus Eclipse als Java-Anwendung) perfekt funktioniert.

UPD.

Soweit ich verstanden habe, ist die Verwendung eines Filters die einzige Lösung in meinem Fall.

Ich kannte den Standard-CharacterEncodingFilter nicht. Verwende ihn jetzt, funktioniert sehr gut!

    CharacterEncodingFilter
    org.springframework.web.filter.CharacterEncodingFilter

        encoding
        UTF-8

        forceEncoding
        true

    CharacterEncodingFilter
    *

3voto

Bozho Punkte 570413

Ihre JSP-Dateien müssen auf zwei Arten UTF-8 sein:

  • die Kopfzeile <%@page pageEncoding="UTF-8" %>
  • ihre Inhalte - Rechtsklick > Eigenschaften in Eclipse und dort die Codierung auf UTF-8 ändern (es könnte sich weigern, es umzuwandeln, also schneiden Sie den aktuellen Inhalt aus, ändern Sie die Codierung und fügen Sie ihn dann wieder ein)

Dann hat Spring einen CharacterEncodingFilter für diesen Fall, der keine signifikante Leistungseinbuße haben sollte:

    CharacterEncodingFilter
    org.springframework.web.filter.CharacterEncodingFilter

        encoding
        UTF-8

       forceEncoding
       true

Eigentlich sollte kein Filter eine signifikante Leistungseinbuße haben, es sei denn, seine Methode doFilter() ist als synchronized deklariert.

2voto

Vladimir Dyuzhev Punkte 17849

Das ist Ihr Preis für die korrekte Codierungstransformation: UTF-8 (Anforderung) -> UTF-16 (Java) -> UTF-8 (DB).

Ich wäre jedoch überrascht, wenn es (die Transformation) mehr als ein paar Prozent der Gesamtanforderungszeit in Anspruch nehmen würde. Wenn doch, wird meiner Meinung nach etwas falsch gemacht.

Alle JSP-Seiten ... wurden mit UTF-8 erstellt

Stellt Ihr Container UTF-8 als Seitenkodierung ein? (Siehe generierte Seiteneigenschaften). Wenn ja, muss kein Filter festgelegt werden. Der Browser würde das Formular wieder in UTF-8 übermitteln.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X