2008-10-30 7 views
2

Pour une recherche de noms ajax très simple, j'envoie un identifiant de la page Web du client au serveur (Tomcat 5.5, Java 5), ​​le recherchant dans une base de données et retournant un string, qui est assignée à une variable javascript dans le client (et ensuite affichée).Java -> Apache Commons StringEscapeUtils -> escapeJavaScript

Le code javascript qui reçoit la valeur est assez standard:

//client code - javascript 
xmlHttp.onreadystatechange=function() { 
    if (xmlHttp.readyState==4) { 
     var result = xmlHttp.responseText; 
     alert(result); 
     ... 
    } 
    ... 
} 

Pour retourner la chaîne, j'avais d'abord ce dans le serveur:

//server code - java 
myString = "..."; 
out.write(myString.getBytes("UTF-8")); 

Ce qui a parfaitement fonctionné, si dangereux. Plus tard, je l'ai remplacé avec:

import org.apache.commons.lang.StringEscapeUtils; 
... 
myString = "..."; 
out.write(StringEscapeUtils.escapeJavaScript(myString).getBytes("UTF-8")); 

Mais en plus sûr, la chaîne résultante ne peut pas être affiché correctement si elle contient des caractères spéciaux comme « ñ ».

Par exemple, en utilisant:

escapeJavaScript("años").getBytes("UTF-8"); 

envoie:

an\u00F1os 

au client.

La question: existe-t-il un moyen simple d'analyser la chaîne résultante en Javascript ou existe-t-il une autre fonction d'échappement que je peux utiliser dans Java pour éviter ce problème?

Répondre

1

Les travaux suivants dans tous les navigateurs que j'ai essayé:

javascript:alert("a\u00F1os"); 

Peut-être votre chaîne est d'être deux fois par erreur se sont échappés.

+0

Oui, je pense que dans ce cas particulier l'évasion était inutile (voir mon autre commentaire ci-dessous) –

1

En fait, maintenant que je l'ai lu plus, je pense que je ne suis pas fait besoin d'échapper à la chaîne je renvoyer tout ... C'est, StringEscapeUtils.escapeJavaScript serait utile si la valeur résultante a été imprimé dans la page, comme:

//javascript code with inline struts 
var myJavasriptString = "<%=myJavaString%>"; 

Ou suis-je manque quelque chose et il y aurait encore une raison valable de faire l'évasion dans l'affaire initiale? (quand il est retourné comme une série d'octets à un gestionnaire ajax onreadystatechange et assigné à une variable js)

Questions connexes