参数问题包含空格

Issues with Parameters containg whitespaces

我在使用 Freemarker 时遇到以下情况。

在 .ftl 中返回页面时,我从 Java 向 url 发送一个参数,类似于 "AAA% BBB@DDD.COM",在 Java 中是可以的。

当查看 Url 时,它会写入:"AAA%25+BBB@DDD.COM" 然后使用以下代码:

<#if myCase??>
    value = ${user}
</#if>

它确实写入了我的 html 字段 "AAA%" 但没有写入其余字段。

我该如何解决这个问题? 提前致谢。

编辑:经过进一步调查,我确实看到我之前输入的代码确实在 Html:

上写了这个
value="AAA%" BBB@CCC.com=""

EDIT2:让我们看看我能否为您提供更多信息,首先,这是相关的 Java 代码:

Map mapping = new HashMap();
if(user != null && !user.isEmpty()){
 mapping.put("user",user); //EG: AAA% BBB@DDD.COM (Checked in debug)
}

我有一个 URL 类似于:mysite.xx?user=AAA%25+BBB@DDD.COM 所以用户它被附加为 url 的查询参数.

我确实需要重新使用 "user" 参数来重新填充与用户名相关的表单字段,我知道这不是有效的电子邮件,但是客户已经安装的别名系统执行此别名系统方式。

问题的可能原因是什么

鉴于您的模板:

<#if myCase??>
    value = ${user}
</#if>

Freemarker 在输出模式下写入的输出 HTML 结果如下:

value = AAA% BBB@DDD.COM

Freemarker 不理解(根据您的上下文)user 的值应该是一个属性值(赋值)。相反,它将字符串 user 的内容视为 HTML 本身(这可能是完整的 HTML-源作为输入字段、单个标签等)。它只是将 model 的内容粘贴到模板中设置变量插值 ${user}.

的位置

Freemarker 结果无效 HTML(属性值对),因为每个属性都应遵守一些命名约定(即没有特殊字符)。当属性有值时,它后面跟一个等号,然后是用双引号括起来的值。

因此大多数 浏览器会将您的结果转换为有效的 HTML 属性 - 实际上是两个属性:value="AAA%"BBB@CCC.com=""。在 Firefox 中打开输出-HTML,您将在 Inspector 中看到这个(不在原始源代码视图中):

<input type="text" value="AAA%" bbb@ddd.com="">

不是什么原因

FreeMarker 在写入最终 HTML.

时是 auto-escaping(尤其是在 OutputMode HTML 时)

@ddekany Thanks for your comment ! It made me reproduce and discover the real cause.

URL encoding/decoding

在 Java 中,您甚至可以对字符串变量 user 进行编码。所以它将%(即百分号后跟[=​​90=]space)转换为有效的%25+在 URL.

中使用

运行 this java snippet IDEONE上线到URL-编码和URL-解码的效果。

解决方案

通过修复模板中的 HTML-属性值分配,使用以下任一解决方案获得所需的输出:

(1) 使用双引号:

   <#if myCase??>
       value="${user}"
   </#if>

(2) 使用一些内置函数来转换纯字符串输出:

使用 FreeMarker 的一些 内置函数 来处理字符串。在您的情况下,您可以将 ?url 附加到变量名称并在模板中的 variable-interpolation 周围使用 double-quotes,例如:

   <#if myCase??>
       href="mailto:${user?url}"
   </#if>

注意:尽早验证 URL 或电子邮件地址(甚至部分)

BBB@DDD.COM 是一个有效的电子邮件地址。但是 %whitespaces 不允许出现在电子邮件地址中。

另一方面,@ 通常不是 URL 的一部分,除非是 query-param 值中的一部分。但是你的 user (URL) 不是以 http:// 等开头的

因此,根据您的 use-case/purpose(所谓的 URL)user 的值 AAA% BBB@DDD.COM,它最终可以代表 URL 的一部分或电子邮件地址。

在你的特殊情况下,说:

populate the form field relative to the username. Model-variable user does not contain a valid email-address. It is used in conjunction with an alias system already installed by the customer. So aliasing will work this way.

让我们假设稍后编辑表单字段的最终用户负责使其有效(或脚本执行此验证)。

无论如何请记住,互联网地址(如 URL/email)需要一些验证:

  • 在写入最终的 HTML 之前(使用 Java 或 Freemarker)
  • 或在您的网页中进一步处理后(使用 Java脚本)。

否则可能达不到预期的效果

另见

相关问题:

  • Is there any way to url decode variable on Freemarker?
  • Java URL encoding of query string parameters