Tomcat, JSP, UTF-8 und URL-Codierung

tme

Aktives Mitglied
Hallo,

in unser Programm ist eine Suche integriert. Diese Suche arbeitet mit einzelnen Seiten, welche über ein Menü mit der Seitennummer angesteuert werden, ähnlich der Suche über z.B. Google, also mit "2" bekommt man die Suchergebnisse 11-20 usw.

Die Codierung der URL, die für die Suchseiten benötigt wird, macht eine Routine, die aus den an die erste Suchseite übergebenen Parametern eine URL für die weiteren Seiten aufbaut:

Java:
        String bar = translationResultPage+": ";
        String parameterString = "";
        java.util.Enumeration parameters = request.getParameterNames();
        while(parameters.hasMoreElements())
        {
            String parameter = (String)parameters.nextElement();
            boolean add = true;
            for(int i=0;i<ignoreParameters.length && add;i++)
            {
                if(parameter.indexOf(ignoreParameters[i])>-1) {
                    add = false;
                }
            }
            if(add)
            {
                String[] parametervalues = request.getParameterValues(parameter);
                for(int i=0;i<parametervalues.length;i++)
                {
                    parameterString += "&amp;"+parameter+"="+java.net.URLEncoder.encode(parametervalues[i],"UTF-8");
                }
            }
        }

Hiermit wird also eine URL erzeugt, die alle übergebenen Parameter an die Zielseite weitergibt.

Die URL für die zweite Seite der Suche nach "test" sieht also z.B. so aus:

Java:
... searchresult.jsp?position=10&x=24&searchstring=test&y=7

Wir finden hier jedoch unerwarteterweise eine Problematik mit Umlauten. Soweit ich verstanden habe, müssen Umlaute einfach mittels

Java:
URLEncoder.encode(String,String)

kodiert werden. Wir nutzen diese Funktion (wie oben gesehen), und so sieht für den Suchbegriff "Hängemappe" die URL für die zweite Seite so aus:

Java:
... searchresult.jsp?position=10&x=20&searchstring=h%C3%A4ngemappe&y=4

Codiert werden hier die 2 Zeichen, die in UTF8 ein "ä" ergeben. Tests mit einschlägigen Seiten, die URL-Codierung online anbieten, zeigen, dass die Decodierung der URL normal ein "ä" wiedergibt.

Rufen wir jetzt jedoch über den angegebenen Link die zweite Seite des Suchergebnisses auf, so beinhaltet die Variable (String), die den Suchbegriff mittels

Java:
searchstring = (String)request.getParameter("searchstring");

übernimmt, nicht mehr "hängemappe", sondern "hängemappe".

Bei den beiden komischen Zeichen handelt es sich um die beiden Zeichen, die zusammen das "ä" in UTF8 ergeben.

Wir vermuten, dass es sich durch eine Konfigurationsänderung ergeben hat. Die Server, auf denen das Shopsystem läuft, sind kürzlich auf neue Server und eine neue Anbindung umgezogen, wobei die Konfiguration nicht 1 zu 1 übernommen wurde.

Was ich noch hinzufügen kann:

- Die Seite wurde mit UTF-8-Kodierung versehen:

Java:
<%@ page pageEncoding="UTF-8" %>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

- Die Erkennung des lokalen Browsers auf UTF-8 funktioniert.

Hat jemand irgendeine Idee, wie es zu dieser Konstellation kommen kann?

Danke.
 

tme

Aktives Mitglied
Hallo und vielen Dank für den Vorschlag,

aber so ganz kann ich mich damit noch nicht abfinden. Ich glaube derzeit noch, dass dieses Verhalten entweder auf Unverständnis meinerseits basiert oder als Fehler bereits bekannt sein muß.

Ich habe mal 2 winzige JSPs erzeugt, mit denen das Verhalten trivial nachvollziehbar ist.

Datei 1:
Java:
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<jsp:useBean id="shop" scope="session" class="de.branion.br.Shop" >
    <jsp:setProperty name="shop" property="domain" value="<%=new java.net.URL(request.getRequestURL().toString()).getHost()%>" />
</jsp:useBean>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@page import="java.net.URLEncoder"%><html>
<%
if(request.getParameter("searchstring")!=null) {
  response.sendRedirect(shop.getUnsecureConnection()+"/system/testrun1.jsp?searchstring=" + URLEncoder.encode(request.getParameter("searchstring"), "UTF-8"));
}
%>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<form style="display: inline" action="<%=shop.getUnsecureConnection() + response.encodeURL("system/testrun2.jsp")%>" method="post" id="searchform">
  <table width="100%" border="0" cellspacing="0" cellpadding="0">
    <tr>
      <td valign="middle">
        <div style="width: 125px">
          <input name="searchstring" style="width: 125px" type="text" class="textfeld" maxlength="80" value="<%if (request.getParameter("searchstring") != null) {out.write((String) request.getParameter("searchstring"));}%>" accesskey="s">
        </div>
      </td>
      <td>
        <img border="0" src="imgs/transparent.gif" width="2" alt="">
      </td>
      <td valign="middle" align="right">
        <div>
          <input type="image" src="imgs/transparent.gif" class="buttongo">
        </div>
      </td>
    </tr>
  </table>
</form>

</body>
</html>
Datei 2:
Java:
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<jsp:useBean id="shop" scope="session" class="de.branion.br.Shop" >
    <jsp:setProperty name="shop" property="domain" value="<%=new java.net.URL(request.getRequestURL().toString()).getHost()%>" />
</jsp:useBean>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
  <%=request.getParameter("searchstring")%><br>
</body>
</html>

Steuert man testrun2.jsp an und gibt im Eingabefeld "test" ein, so wird dieser Parameter auf der URL-Zeile korrekt und literal übergeben. Gibt man dagegen ein "ä" ein, so codiert zwar der Link den Umlaut in die Prozentwerte, Firefox 3.5.7 zeigt jedoch in der URL-Eingabezeile beim Parameter ein "ä" an. Fange ich dies entsprechend mit request.getparameter ab, so resultiert dies in die 2 Zeichen, die ein "ä" in UTF-8 codieren.

Kann jemand dieses Verhalten in eurem Tomcat nachvollziehen? Ist das vielleicht ein Browserproblem?

Danke,

Thomas

Edit: spannend ist in diesem Zusammenhang vielleicht noch, dass es meiner Einschätzung nach mit der URL-Codierung einen Informationsverlust gibt. Die Information, dass diese beiden Zeichen in der URL-Codierung vor der Codierung ein Zeichen waren, ist nicht mehr vorhanden. So kann doch eigentlich die Interpretation, die am Ende die URL auflöst, nicht unterscheiden, ob ich im Quellstring ein "ä" hatte oder die zwei Zeichen tatsächlich Teil des Quellstrings waren.
 
Zuletzt bearbeitet:

tme

Aktives Mitglied
Kurzer Hinweis: Nimmt man die manuelle Codierung nicht mit UTF-8, sondern mit latin1 als Encoding vor, so fällt das Problem weg, weil hier nicht mehr 2 Zeichen, sondern nur 1 Zeichen codiert werden und die Ambiguität nicht mehr anfällt. Wie erwartet interpretiert bzw. liest Java die Parameter dann korrekt ein und wandelt latin1-codierte Umlaute in die UTF-8-Äquivalente um.
 

tme

Aktives Mitglied
Wir haben jetzt alle auf der URL-Zeile benötigten Umlautcodierungen in latin1 anstatt UTF-8 vorgenommen, damit umgehen wir das Problem. Wir verstoßen damit zwar gegen die Empfehlungen vom WWW, aber dafür haben wir eine Lösung :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ruutaiokwu Servlet Tomcat Versionsproblem? Web Tier 4
I JSF JSF, Tomcat, Server Faces und maven Web Tier 3
feinperligekohlensaeure JSF JSF + Tomcat 9 | HTTP Status 404 |(com.sun.faces.config.ConfigureListener?) Web Tier 1
R Tomcat - java.lang.OutOfMemoryError: PermGen space Web Tier 0
puba mit JDev entwickelter WS auf Tomcat deployen Web Tier 2
R JSF Tomcat 7 & JSF - UnsupportedOperationException Web Tier 1
G Probleme mit Java + Tomcat | Cannot switch on a value of type String for source level below 1.7 Web Tier 8
S Tomcat 8.0.9 logging Web Tier 0
S Servlet Tomcat 8.0.9 logging Web Tier 13
D JSP Anfängerfrage - Ändern von JSP / Tomcat Web Tier 4
R Tomcat 7 und SSL Web Tier 3
J JSP Web Applikation auf virtuellem Tomcat Server Web Tier 1
T JSF in Eclipse mit Tomcat Web Tier 0
S JSF Tomcat in Eclipse einbinden (JSF) Web Tier 0
G Magnolia CMS - jedes mal Tomcat restart Web Tier 7
A Wartezeit nach Tomcat start wegen Servlets zu hoch Web Tier 2
M tomcat anwendungsabhängige konfigdateien Web Tier 6
H JSP, Eclipse, Tomcat - Java Klasse wird nicht gefunden Web Tier 8
C Tomcat wirft keine ViewExpiredException Web Tier 8
C Tomcat + Eclipselink = NotSerializable Exception? Web Tier 2
M JSP Problem beim deployen auf Tomcat Web Tier 2
A Servlet File Upload funktioniert nur lokal auf Entwicklungsrechner, nicht in Tomcat Web Tier 5
T Tomcat mit Servlets Problem Web Tier 7
B JSF JSF1.1 @Tomcat 5.5 für ein neues Projekt Web Tier 18
P JSF Umgebungsvariablen bei Tomcat-Start setzen Web Tier 4
D Tomcat/Struts2 Benutzer bestimmt Name der URL Web Tier 2
T Tomcat: Packete dynamisch auslesen und Klassen erzeugen Web Tier 3
S Servlet Problem mit Tomcat Web Tier 3
M Classpath für JPA in Tomcat Webapp: Wie konfigurieren? Web Tier 4
reibi Tomcat : Änderbare Config-Files Web Tier 5
reibi Servlet Tomcat : Display name und version setzen Web Tier 3
JCODA Tomcat ohne Fenster starten Web Tier 5
P Eclipse zeigt Errors an, die auf Tomcat nicht auftreten Web Tier 2
B Tomcat 6 ergibt Fehler - java.net.SocketException Web Tier 2
L Services in Tomcat einbinden? Web Tier 2
B JSF Tomcat Windows Linux equals Problem Web Tier 3
N JSP org.apache.tomcat cannot be resolved to a type InstanceManager cannot be resolved to a type Web Tier 4
S Tomcat 7, Struts, JPA baut keine Verbindung auf Web Tier 13
M Geschwindigkeit von Tomcat / JavaWebanwendungen Web Tier 3
D Probleme mit Tomcat Web Tier 3
M Tomcat 6 Umlaut Probleme Web Tier 2
F No Factories configured for this Application - Myfaces mit Tomcat Web Tier 1
T jsf Tobago in Tomcat classpath aufnehmen Web Tier 2
A Beispiel wirft Fehler. JSF 2.0 / Tomcat / Eclipse Web Tier 2
J Tomcat-Server mit JSF auf Eclipse einrichten Web Tier 7
F umzug von tomcat 4 auf tomcat 6 Web Tier 2
J tomcat webapp restarten Web Tier 2
ruutaiokwu tomcat autodeploy Web Tier 7
I Tomcat aktualisiert CSS - Datei nur ab und zu Web Tier 4
T Tomcat-Projektverzeichnis Web Tier 13
E JSF Applikation läuft nicht über Tomcat Web Tier 3
F JApplet in Tomcat-Umgebung funktioniert mal wieder nicht ... Web Tier 8
A Hat Tomcat einen Cache? Web Tier 5
S Tomcat Heap Memory erhoehen..? Web Tier 4
I Rich Faces nur mit JBoss oder auch Tomcat? Web Tier 7
S Tomcat / Eclipse Probleme Web Tier 2
T Tomcat Projekt ohne Eclipse starten Web Tier 11
A Tomcat - JSP läuft nicht Web Tier 2
reibi access.log in Tomcat ... ist das möglich? Web Tier 2
R Fehler 1053 beim Beenden von Tomcat Web Tier 25
A Tomcat - JSP ausführen Web Tier 8
M Tomcat - Mehrere Verzeichnisse für die jsp Web Tier 12
thE_29 Tomcat - Applications(Context) bekommen Web Tier 19
A Tomcat: beim Start des Servers einmalige Aktion aufrufen (Problem gelöst) Web Tier 2
T Hibernate, Debuggingparameter Tomcat Web Tier 3
A JDBC in Tomcat einbinden Web Tier 3
P Tomcat funktioniert nicht so wie er sollte Web Tier 11
C Tomcat total memory Web Tier 11
C Apache-Tomcat Web Tier 13
F ssl, tomcat und jsp anwendungen Web Tier 5
G Tomcat 4.1 Experimente 8) Web Tier 3
S Tomcat JSP context.xml - Standartpfad einstellen Web Tier 3
J Fehler Tomcat/JSP findet Methode nich Web Tier 3
jann Tomcat und Kompression Web Tier 9
Q tomcat konfiguration - rewrite Web Tier 3
A TomCat will nicht - Wieso? Web Tier 5
Q Auth. per Tomcat Web Tier 4
O kurze Frage zur Tomcat Installation Web Tier 2
G Probleme mit Tomcat Web Tier 14
G Tomcat findet angeblich die Datei nicht. Web Tier 8
J Tomcat - web.xml und package . Web Tier 4
L JSP Tomcat Login Web Tier 6
G SCHWERWIEGEND: NullPointerException bei Tomcat Web Tier 4
U Java Application auf Tomcat Web Tier 5
Y JSF - Exception bei Tomcat Start Web Tier 4
O Source-Code vom Tomcat kompilieren lassen Web Tier 6
D Codierung im Frontend funktioniert nicht richtig Web Tier 2

Ähnliche Java Themen

Neue Themen


Oben