请求参数丢失加号

2022-09-01 15:19:02

我正在编辑搜索表单并尝试防止数据库中出现特殊字符。在 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在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转义实用程序类等)。

如果有帮助,在 JavaScript 中使用警报表示在发送请求之前未转换 + 号。


答案 1

+在 URL 中表示“空格”。将其替换为 。例如,您可以在作曲后执行此操作。%2BdescriptionsUrlAddition

descriptionsUrlAddition = descriptionsUrlAddition.replace("+", "%2B");

答案 2

对于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 一部分的任何特殊字符。