JSP, Spring, Ajax und Encoding

Zum Thema Encoding hat wohl jeder seine eigene Leidensgeschichte. Spontan fällt mir dazu immer folgendes Bild ein:

Encoding
(Gefunden auf: Geek and poke)

Ausgangssituation ist eine JSP, die ein Inputfeld beinhaltet, in dem nach Phrasen gesucht werden kann. Gibt man zum Beispiel „mü“ ein, wird per Ajax die Datenbank nach Mitarbeitern durchsucht, die „mü“ im Vor- bzw. Nachnamen haben. So weit, so gut. Auf der Gegenseite – dem Server – steht ein Controller, der per

@RequestMapping( value = "/ajax/mitarbeiter/" )

darauf wartet, mit „mü“ gefüttert zu werden. Beim Debugging habe ich festgestellt, dass „mü“ zwar zunächst richtig an die URL angehangen wurde, jedoch schon zerschossen beim Controller ankam. Da die ganze Geschichte auf einem Apache Tomcat läuft, suchte ich zunächst hier den Fehler und wurde fündig. Im Ordner „conf“ im Tomcat-Verzeichnis befindet sich unter anderem die server.xml. Diese beinhaltet die Definition für den HTTP Connector.

Tomcat HTTP Connector
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

Es scheint unspektakulär und man meint sich mit Charset-Metatags innerhalb der JSP in Sicherheit zu wiegen, aber um eine Erweiterung des Tags mit dem Attribut „URIEncoding“, kommt man trotzdem nicht drumrum.

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="utf-8" />

Anschließend sollte auch im Debugging nachzuvollziehen sein, dass die Umlaute von der JSP in Richtung des Servers richtig ankommen.

Controller & @RequestMapping

Nochmal zum Controller… Mit hoher Wahrscheinlichkeit, holt der Controller die Daten richtig aus der Datenbank, was bei mir auch in der Liste aus Userobjekten zu sehen war. Jedoch stellte ich im Logging abermals fest, dass es die Umlaute nicht in einem Stück wieder zurück zur JSP schaffen. Badum tss :( Ich bin selbst über genügend Beispiele gestolpert, die versuchen das Charset mit getBytes() oder irgendwelchen anderen Möglichkeiten zu setzen, aber unterm Strich, war das alles nicht von Erfolg gekrönt. Stattdessen, gibt es die Möglichkeit der Methode im Controller noch mitzuteilen, was sie eigentlich zurückgibt.

@RequestMapping( value = "/ajax/mitarbeiter/", produces = "application/json;charset=utf-8" )

Das war die ganze „Magic“ an dem Encodingsumpf.

Resumée

Geht man wirklich Schicht für Schicht durch, so, wie auch der Request verläuft, wird man sicherlich über genau diese Stellen stolpern. Es ist auch grundsätzlich zu empfehlen, das Charset der JSP per Meta-Tag zu setzen und natürlich einen entsprechenden Filter zu definieren:

 <filter>
     <filter-name>encoding-filter</filter-name>
     <filter-class>
  org.springframework.web.filter.CharacterEncodingFilter
     </filter-class>
     <init-param>
  <param-name>encoding</param-name>
  <param-value>UTF-8</param-value>
     </init-param>
     <init-param>
     <param-name>forceEncoding</param-name>
     <param-value>true</param-value>
     </init-param>
 </filter>

 <filter-mapping>
     <filter-name>encoding-filter</filter-name>
     <url-pattern>/*</url-pattern>
 </filter-mapping>

 

Schreib einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *


*