Probleme bei encoded GET-String in Servlet

Mein servlet muss damit Rechnen, dass ein GET-Aufruf in enkodierter Form reinkommt, z.B.:

"GET /somesite?ID%3D11944%26number%3D45612%26Text%3DSw+648%26message%3DSw+648%26custParam%3Dcode42 HTTP/1.0"  

Dadurch habe ich das Problem, dass ich nicht wie gewohnt die Parameter über das HttpServletRequest Objekt die Parameter auslesen kann (via getParameter(). Iteriere ich durch alle Parameter, kommt die gesamte GET-Kette als ein String heraus (also nur ein Parameter)

Nun frage ich mich zwei Sachen:

  1. Wie ist der eleganteste Weg, dass ich die zusammengeklebten GET-Parameter aus dem request umkodiere, um sie wieder einfach abfragen zu können?
  2. Wenn ich die „zusammengeklebte“ Parameterkette im Kontext des response-Objektes ausgebe, erscheint die Zeichenkette nicht mehr enkodiert, sondern im gewohnten Format. Liegt das an der Kodierung des Writers?

Hallo serethos.

Mein servlet muss damit rechnen, dass ein GET-Aufruf in
enkodierter Form reinkommt, z.B.:

„GET
/somesite?ID%3D11944%26number%3D45612%26Text%3DSw+648%26message%3DSw+648%26custParam%3Dcode42
HTTP/1.0“

Das ist kein gültiger GET-Request, denn die Parameter wurden offensichtlich falsch URL-codiert!

Statt
ID %3D 11944 %26 number %3D 45612 %26 Text %3D Sw+648 %26 message %3D Sw+648 %26 custParam %3D code42

muss es heißen:

ID = 11944 & number = 45612 & Text = Sw%20648 & message = Sw%20648 & custParam = code42

D.h. & und = als Parametertrennzeichen dürfen nicht mit-codiert werden.

Dadurch habe ich das Problem, dass ich nicht wie gewohnt die
Parameter über das HttpServletRequest Objekt die Parameter
auslesen kann (via getParameter().

Iteriere ich durch alle Parameter, kommt die gesamte GET-Kette als ein
String heraus (also nur ein Parameter)

Kein Wunder, garbage in, garbage out … :wink:

Wie ist der eleganteste Weg, dass ich die zusammengeklebten
GET-Parameter aus dem request umkodiere, um sie wieder einfach
abfragen zu können?

Du solltest Dir den GET-Request vom Client korrekt schicken lassen.
Dann kannst Du auch mit den gewohnten Servlet-Methoden arbeiten.

Hast Du keinen Einfluss auf den Client, kannst Du folgenden Hack machen:

import java.net.\*;
import java.util.\*;

public class UrlDekodierer {
 public static void main(String[] args) throws Exception {
 // URL mit falsch codierten Parametern (& = %26):
 String sUrl = "http://somesite?ID%3D11944%26number%3D45612%26Text%3DSw+648%26message%3DSw+648%26custParam%3Dcode42";

 URL url = new URL(sUrl); // siehe http://java.sun.com/j2se/1.5.0/docs/api/java/net/URL.html
 String sCodierteParameter = url.getQuery();

 // korrekte URLs zuerst in Parameter=Wert-Paare zerlegen:
 //String[] arrParameterWertPaare = sCodierteParameter.split("&");
 //System.out.println("arrParameterWertPaare=" + Arrays.toString(arrParameterWertPaare));

 String sDecodierteParameter = URLDecoder.decode(sCodierteParameter, "UTF-8"); // siehe http://java.sun.com/j2se/1.5.0/docs/api/java/net/URLDecoder.html 
 System.out.println("sCodierteParameter='" + sCodierteParameter + "' ==\> '" + sDecodierteParameter + "'");

 // falsch codierte URLs müssen erst decodiert werden, um sie zerlegen zu können: 
 String[] arrParameterWertPaare = sDecodierteParameter.split("&");
 System.out.println("arrParameterWertPaare=" + Arrays.toString(arrParameterWertPaare));

 // jedes Pärchen verarbeiten:
 for (int i=0; i

Gruß,
-Andreas.