【问题标题】:Request Parameter Losing Plus Sign请求参数丢失加号
【发布时间】:2011-12-12 03:43:18
【问题描述】:

我正在编辑一个搜索表单并试图防止数据库中的特殊字符。在 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 中使用警报表明 + 号在发送请求之前没有被转换。

【问题讨论】:

    标签: java javascript html url escaping


    【解决方案1】:

    + 表示 URL 中的“空格”。将其替换为%2B。例如,您可以在编写 descriptionsUrlAddition 之后执行此操作。

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

    【讨论】:

    • 你将如何实现这个?
    • @Rachel G.,只需将 URL 字符串中的所有 + 符号替换为 %2B。一旦你的 URL 被组合成一个字符串,你就可以使用Stringreplace() 方法。添加示例。
    • 将代码 (escape(descriptionSelectBox.options[i].value).replace("+", "%2B")) 添加到您的答案中,我会将其标记为正确。谢谢=)
    • @Rachel G.,更好的是,在整个字符串中替换它。这样会更有效率,因为您只需调用一次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 一部分的任何特殊字符。

    【讨论】:

    • encodeURI() 不会将 + 更改为 %2B。只有encodeURIComponent() 可以。
    【解决方案3】:

    你应该在前端使用 javascript encodeuri 函数来编码你的参数。

    【讨论】:

      猜你喜欢
      • 2012-11-13
      • 2017-04-06
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 2013-10-18
      相关资源
      最近更新 更多