Solicitar pérdida de parámetro de signo más

3 minutos de lectura

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.

avatar de usuario de rid
librar

+ significa “espacio” en las URL. reemplazarlo con %2B. Podrías hacer esto justo después de componer descriptionsUrlAdditionpor 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 usar String‘s replace() 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

Avatar de usuario de Henry Zhang
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. Solamente encodeURIComponent() 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.

¿Ha sido útil esta solución?