Я редактирую форму поиска и пытаюсь защитить ее от специальных символов в базе данных. В форме поиска JSP выпадающий список (multiselect) позволяет пользователям выбирать описания, которые будут использоваться в запросе (примечание: описания - это список строк):
<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 `~!@#$%^&*()_+-={}|[]\:";'<>?,./ И надо же, здесь много специальных символов.
В приведенном выше коде, по какой-то причине, когда запрос попадает в контроллер, описание теряет знак + (становится просто пробелом).
Кто-нибудь знает, что может происходить и как это исправить? Я не уверен, что это как-то связано с особым использованием знака + в URL, или что. Я мог бы отредактировать то, как заполняется список описаний (возможно, там есть экранирование). Если вы предлагаете это в качестве предложения, пожалуйста, используйте код, специфичный для Java (без классов Apache escape utils и т.д.).
Если это поможет, использование предупреждений в JavaScript показывает, что знак + не преобразуется перед отправкой запроса.