Estoy editando un formulario de búsqueda y tratando de protegerme contra caracteres especiales en la base de datos. En el formulario de búsqueda JSP, un menú desplegable (selección múltiple) permite a los usuarios seleccionar las descripciones que se utilizarán en la consulta (nota: las descripciones son una lista de cadenas):
<select id="descriptionSelect" multiple="multiple">
<c:forEach items="${descriptions}" var="description">
<option value="${fn:escapeXml(description)}")}">
<c:out value="${description}" />
</option>
</c:forEach>
</select>
Cuando se envía el formulario, la página genera dinámicamente la URL que toma los parámetros de consulta en la URL (feo, lo sé, las manos están atadas). Aquí está el fragmento que hace el segmento de descripción.
var descriptionSelectBox = document.getElementById("descriptionSelect");
var descriptionsUrlAddition = "";
for (var i = 0; i < descriptionSelectBox.options.length; i++) {
if (descriptionSelectBox.options[i].selected) {
descriptionsUrlAddition += "&descriptions=" + escape(descriptionSelectBox.options[i].value);
}
}
Tengo una entrada de prueba en la base de datos cuya descripción es:
AAA `~!@#$%^&*()_+-={}|[]\:”;’?,./ Y wow esto tiene muchos caracteres especiales.
Con el código anterior, por alguna razón, cuando la solicitud llega al controlador, la descripción pierde el signo + (se convierte en solo un espacio).
Alguien sabe que puede estar pasando y como solucionarlo? No estoy seguro de si tiene algo que ver con el uso especial de URL de +, o qué. Podría editar cómo se completa la lista de descripciones (tal vez escapando allí). Si ofrece esto como una sugerencia, utilice el código específico de Java (sin clases de utilidades de escape de Apache, etc.).
Si ayuda, el uso de alertas en JavaScript indica que el signo + no se está transformando antes de enviar la solicitud.
librar
+
significa “espacio” en las URL. reemplazarlo con %2B
. Podrías hacer esto justo después de componer descriptionsUrlAddition
por ejemplo.
descriptionsUrlAddition = descriptionsUrlAddition.replace("+", "%2B");
-
Sin embargo, ¿cómo implementarías esto?
– Chica Codificadora Snowy
20/10/2011 a las 21:38
-
@Rachel G., simplemente reemplaza todo
+
signos con%2B
en la cadena de URL. Una vez que su URL esté compuesta y la tenga como una cadena, puede usarString
‘sreplace()
método. Ejemplo añadido.– librar
20/10/2011 a las 21:38
-
Agrega el código (escape(descriptionSelectBox.options[i].value).replace(“+”, “%2B”)) a su respuesta y la marcaré como correcta. gracias =)
– Chica Codificadora Snowy
20/10/2011 a las 21:42
-
@Rachel G., incluso mejor, reemplácelo en toda la cadena. Sería más eficiente, ya que solo llamarás
replace()
una vez.– librar
20/10/2011 a las 21:43
-
no funciona para mí, tengo una URL con signos + los reemplazó a% 2B, pero no sirve.
– malhobayyeb
31 de octubre de 2014 a las 7:22
henry zhang
Para javascript debes usar encodeURIComponent() o codificador(). Por ejemplo:
var uri = "fj74cvg+fd1==ee";
var res = encodeURIComponent(uri);
y res se codificaría para "fj74cvg%2Bfd1%3D%3Dee"
Para php puedes usar códigourlen(). Por ejemplo:
<?php
echo '<a href="https://stackoverflow.com/questions/7842547/mycgi?foo=", urlencode($userinput), '">';
?>
Estas funciones reemplazarán cualquier carácter especial en la cadena que se usará como parte de la URL.
-
encodeURI()
no cambia+
a%2B
. SolamenteencodeURIComponent()
lo hace.– jdunning
22 de diciembre de 2020 a las 21:41
Debe usar en la parte frontal la función javascript encodeuri para codificar sus parámetros.