Запросить параметр, теряющий знак плюс - PullRequest
16 голосов
/ 21 октября 2011

Я редактирую форму поиска и пытаюсь защитить от специальных символов в базе данных.В форме поиска JSP раскрывающийся список (множественный выбор) позволяет пользователям выбирать описания, которые будут использоваться в запросе (примечание: описания - это список строк):

<select id="descriptionSelect" multiple="multiple">
    <c:forEach items="${descriptions}" var="description">
        <option value="${fn:escapeXml(description)}")}">                            
            <c:out value="${description}" />
        </option>
    </c:forEach>
</select>

Когда форма отправляется, страницадинамически генерирует URL, который принимает параметры запроса в URL (уродливо, я знаю, руки связаны).Вот фрагмент кода, создающий сегмент описания.

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);
    }
}

У меня есть тестовая запись в базе данных, описание которой:

AAA `~! @ # $% ^ & * () _ +- = {} | [] \: "; '<>?,. / Wow это имеет много специальных символов.

С кодом выше, по какой-то причине, когда запрос попадает в контроллер,в описании теряется знак + (он становится просто пробелом).

Кто-нибудь знает, что может происходить и как это исправить? Я не уверен, что это как-то связано с URL-адресами, специально использующими +, илиЧто?. Я мог бы отредактировать, как заполняется список описаний (может быть, избегая там). Если вы предлагаете это в качестве предложения, пожалуйста, используйте специфический код Java (не Apache escape использует классы и т. д.).

Если это поможет,использование предупреждений в JavaScript означает, что знак + не преобразуется перед отправкой запроса.

Ответы [ 3 ]

39 голосов
/ 21 октября 2011

+ означает «пробел» в URL.Замените его на %2B.Вы можете сделать это сразу после написания descriptionsUrlAddition, например.

descriptionsUrlAddition = descriptionsUrlAddition.replace("+", "%2B");
0 голосов
/ 30 декабря 2018

Для JavaScript вы должны использовать encodeURIComponent () или encodeuri () . Например:

var uri = "fj74cvg+fd1==ee";
var res = encodeURIComponent(uri);

и res будут закодированы в "fj74cvg%2Bfd1%3D%3Dee"

Для php вы можете использовать urlencode () . Например:

<?php
echo '<a href="mycgi?foo=', urlencode($userinput), '">';
?>

Эти функции заменят любые специальные символы в строке, которые будут использоваться как часть URL.

0 голосов
/ 02 октября 2017

Вы должны использовать на лицевой стороне функцию кодирования javascript для кодирования ваших параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...