Texte richtig encoden
Bei vielen Entwicklern herrscht offenbar wenig Klarheit, wie Zeichenketten im Web korrekt auszugeben sind. Insbesondere wenn die Nutzer selbst Text eingeben können ist es unerläßlich, die Eingabe korrekt zu encoden, da anderenfalls ein erheblicher Schaden angerichtet werden kann. Ein kleiner Javascript - Schnipsel, der fortan alle Nutzer auf eine andere - fremde - Seite leitet, ist dabei noch das geringste Problem. Nicht gerade selten geschieht es, dass durch eine bestimmte Nutzereingabe die Funktionalität einer Seite gefährdet wird.
Schauen wir und im folgenden die gebräuchlichen encoding-Verfahren an. Wir nutzen dabei die JSTL (Standard-Taglib). Plazieren Sie dazu folgene Dateien im WEB-INF/lib - Verzeichnis Ihres Tomcat: standard.jar und die jstl.jar. Die standard.jar und die jstl.jar für die Standard-Taglib sind auf dem Tomcat üblicherweise schon installiert (in common oder shared).
Die Taglib wird in der bekannten Weise in der Seite angemeldet:
<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html>...
Um Nutzereingaben anzuzeigen eignet sich der c:url - Tag.
<c:out value="ömü<jsjsjd>sorl& weiter"/> <c:out value="http://myserver/page.jsp?key=öm ü&key2=<span>"/>
Die Ausgabe ist:
ömü<jsjsjd>sorl&amp; weiter http://myserver/page.jsp?key=öm ü&key2=<span>
Wie man sieht, werden die deutschen Umlaute nicht in ihre HTML - Sonderzeichen umgewandelt; Der Tag erwartet, dass der Browser beim Page-Encoding UTF-8 diese Zeichen korrekt anzeigen kann. Die spitzen Klammern sowie das Ampersat Zeichen werden aber wie erwartet in ihre HTML-Äquivalente umgewandelt. Um die URL eines Links auszugeben ist der Tag allerdings wenig geeignet, wie das Beispiel weiter zeigt. Umlaute und Leerzeichen bleiben unverändert, und auch die HTML-Sonderzeichen wird ein Browser in ener URL nicht korrekt interpretieren. Aber es gibt ja noch c:url, versuchen wir das ganze damit:
<pre class="brush:html">
<a href="<c:url value="http://myserver/page.jsp?key=öm ü&key2=<span>"/>">Link</a>
Ausgabe:
<a href="http://myserver/page.jsp?key=öm ü&key2=<span>">Link</a>
Wie man sieht, nimmt c:url gar kein Encoding vor. Das ist auch so beabsichtigt, denn c:url dient vor allem dazu, die SessionId auf einen Link zu schreiben und ggf. den Context-Pfad korrekt zu setzten. Dennoch wird dieses Beispiel funktionieren, denn alle modernen Browser encoden diesen Link selbständig: http://myserver/page.jsp?key=öm%20ü&key2= Das funktioniert aber nur, solange der Browser erkennt, dass es sich um einen Link handelt. Verwenden wir die URL beispielsweise in Javascript, müssen wir sie selbst encoden, da hier der Browser mit einer korrekten URL rechnet. Um eine Javascript-URL zu encoden, nutzen wir den c:url - Tag mit eingeschlossenem c:param - Tag:
Das ist gründlich! Und ein ziemlich standardkonformes Ergebnis. <c:url value="http://myserver/page.jsp">
<c:param name="key" value="öm ü"/>
<c:param name="key2" value="<span>"/>
</c:url>
Ausgabe ist:
http://myserver/page.js?key=%c3%b6m+%c3%bc&key2=%3cspan%3e