web-dev-qa-db-fra.com

request.getQueryString () semble avoir besoin d'un encodage

J'ai un problème avec UTF-8. Mon client (réalisé en GWT) fait une demande à ma servlet, avec quelques paramètres dans l'URL, comme suit:

http://localhost:8080/servlet?param=value

Lorsque dans le servlet je récupère l'URL, j'ai un problème avec les caractères UTF-8. J'utilise ce code:

protected void service(HttpServletRequest request, HttpServletResponse response) 
                    throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");

        String reqUrl = request.getRequestURL().toString(); 
        String queryString = request.getQueryString();
        System.out.println("Request: "+reqUrl + "?" + queryString);
        ...

Donc, si j'appelle cette URL:

http://localhost:8080/servlet?param=così

le résultat est comme ceci:

Request: http://localhost:8080/servlet?param=cos%C3%AC

Que puis-je faire pour configurer correctement l'encodage des caractères?

29
Gabriele

J'ai rencontré ce même problème auparavant. Je ne sais pas quel Java vous utilisez, mais au moins dans Tomcat 5.x (pas sûr à propos de 6.x) la méthode request.setCharacterEncoding() n'a pas vraiment un effet sur les paramètres GET. Au moment où votre servlet s'exécute, les paramètres GET ont déjà été décodés par Tomcat, donc setCharacterEncoding ne fera rien.

Deux façons de contourner cela:

  1. Modifiez le paramètre URIEncoding de votre connecteur en UTF-8. Voir http://Tomcat.Apache.org/Tomcat-5.5-doc/config/http.html .

  2. Comme BalusC le suggère, décodez vous-même la chaîne de requête et analysez-la manuellement (au lieu d'utiliser les API ServletRequest) dans une carte de paramètres vous-même.

J'espère que cela t'aides!

27
schematic

À partir du javadoc HttpServletRequest # getQueryString () :

Renvoie : une chaîne contenant la chaîne de requête ou null si l'URL ne contient pas de chaîne de requête. La valeur n'est pas décodée par le conteneur.

Notez la dernière déclaration. Vous devez donc décodage URL vous-même en utilisant Java.net.URLDecoder .

String queryString = URLDecoder.decode(request.getQueryString(), "UTF-8");

Cependant, la manière normale de collecter des paramètres utilise simplement HttpServletRequest # getParameter () .

String param = request.getParameter("param"); // così

Le servletcontainer l'a déjà décodé par URL pour vous, alors si vous l'avez configuré pour utiliser le codage correct. La request.setCharacterEncoding() n'a d'effet que sur le corps de la requête (POST) et non sur l'URI de la requête (GET). Voir également la réponse de Mirage.

29
BalusC

Ça a vraiment pris toute la journée mais:

final String param = new String(request.getParameter("param").getBytes(
                "iso-8859-1"), "UTF-8");

Voir aussi ici . Notez que ceci est valide ssi le jeu de caractères de décodage (URIEncoding dans Tomcat) du serveur est iso-8859-1 - sinon, ce jeu de caractères doit être transmis. Pour obtenir un exemple de la façon d'obtenir le jeu de caractères URIEncoding à partir du server.xml pour Tomcat 7 voir ma citation réponse

20
Mr_and_Mrs_D

Pour la demande POST, j'ai résolu le problème de la façon suivante.

  1. Définissez URIEncoding = "UTF-8" attr dans server.xml pour Connector; (J'utilise Tomcat 8)
  2. Définissez request.setCharacterEncoding ("UTF-8") avant la récupération des paramètres.

Enfin, j'ai une bonne livraison de caractères utf-8: par exemple String name = request.getParameter ("name");

le nom contient la chaîne utf-8 correcte.

3

De nombreux facteurs affectent le codage des paramètres de requête http. vous pouvez référencer le guide séquentiel pour ce problème.

1. cochez l'encodage des caractères de votre formulaire.

<form id="edit-box" name="edit-box-name" method="post" accept-charset="UTF-8">

2. vérifiez la valeur d'encodage des caractères par défaut du serveur http. Dans le cas du serveur http Apache, ajoutez "AddDefaultCharset UTF-8" chaîne vers le fichier httpd.conf.

3.si vous avez un serveur principal, vérifiez la valeur de codage des caractères du serveur principal. Dans le cas du serveur principal Tomcat, ajoutez l'attribut "URIEncoding =" UTF-8 "à votre connecteur. Comme,

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

...

guide pour les problèmes d'encodage des paramètres de requête http

1
nominor