参数包含空格的问题

时间:2019-02-28 13:44:15

标签: freemarker

我在Freemarker中遇到以下情况。

返回.ftl中的页面时,我从Java向URL发送了一个参数,类似于Java中的“ AAA%BBB@DDD.COM”,就可以了。

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

import React, { Component } from 'react';
import { View } from 'react-native';
import { LoginButton, AccessToken ,GraphRequest, GraphRequestManager} from 'react-native-fbsdk';

export default class Login extends Component {
  render() {
    return (
      <View>
        <LoginButton
    onLoginFinished={
      (error, result) => {
        if (error) {
          alert("login has error: " + result.error);
        } else if (result.isCancelled) {
          alert("login is cancelled.");
        } else {

          AccessToken.getCurrentAccessToken().then(
            (data) => {
              let accessToken = data.accessToken
              alert(accessToken.toString())

              const responseInfoCallback = (error, result) => {
                if (error) {
                  console.log(error)
                  alert('Error fetching data: ' + error.toString());
                } else {
                  console.log(result)
                  console.log(result.email)

                  alert('Success fetching data: ' + result.toString());
                }
              }

              const infoRequest = new GraphRequest(
                '/me',
                {
                  accessToken: accessToken,
                  parameters: {
                    fields: {
                      string: 'name,email'
            }
                  }
                },
                responseInfoCallback
              );

              // Start the graph request.
              new GraphRequestManager().addRequest(infoRequest).start()

            }
          )

        }
      }
    }
    onLogoutFinished={() => alert("logout.")}/>
      </View>
    );
  }
}

它的确在我的html字段“ AAA%”中写了,但没有写。

我该如何解决这个问题? 预先感谢。

编辑:经过进一步调查,我确实看到了之前放的代码确实将其写在HTML上:

 it.only('Test one ', () => {

            expect(x).to.equal(y);
        });
it('Test two ', () => {

            expect(x).to.equal(y);
        });

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

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

我有一个类似于:mysite.xx?user=AAA%25+BBB@DDD.COM的URL,因此将其附加为该URL的查询参数的用户。

我确实需要重用“用户”参数来重新填充相对于用户名的Form字段,我知道这不是有效的电子邮件,但是客户已经安装的别名系统以这种方式进行别名处理。

1 个答案:

答案 0 :(得分:1)

可能是问题的原因

给出您的模板:

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

Freemarker以输出模式HTML编写的输出结果如下:

value = AAA% BBB@DDD.COM

Freemarker不了解(从您的上下文来看)user的值应为属性值(赋值)。相反,它将字符串user的内容视为HTML本身(可以是完整的HTML源代码作为输入字段,单个标记等)。它只是将模型的内容粘贴到模板中您已设置变量插值${user}的位置。

Freemarker结果不是有效的HTML(属性值对),因为每个属性都应遵循某些命名约定(即没有特殊字符)。当该属性具有值时,其后是一个等号,然后是一个用双引号引起来的值。

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

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

不是什么原因

FreeMarker在写入最终HTML时为auto-escaping(尤其是在OutputMode HTML中)。

  

@ ddekany 感谢您的comment!它使我重现并发现了真正的原因。

URL编码/解码

在Java中,您甚至可以编码字符串变量user。因此,它将%(即百分号后跟空格)转换为%25+,可以在URL内部使用。

在IDEONE上在线运行this java snippet,以实现URL编码和URL解码的效果。

解决方案

通过固定模板中的HTML属性值分配,使用以下两种解决方案中的任意一种可获得期望的输出:

(1)使用双引号:

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

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

使用FreeMarker的某些内置字符串。在您的情况下,您可以在变量名后附加?url,并在模板中的 variable-interpolation 周围使用双引号,例如:

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

警告:请尽早验证URL或电子邮件地址(甚至其中的一部分)

BBB@DDD.COM是有效的电子邮件地址。但是在电子邮件地址中不允许使用%空白

另一方面,@通常不是URL的一部分,除了作为 query-param 值内的一部分。但是您的user(URL)不能以http://等开头。

因此,根据具有值user的(所谓的URL)AAA% BBB@DDD.COM的用例/用途,它最终可以表示URL或电子邮件地址的一部分。

在您的特殊情况下,说:

  

填充相对于用户名的表单字段。模型变量user没有包含有效的电子邮件地址。它与客户已安装的别名系统结合使用。因此,混叠将以这种方式工作。

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

无论如何,请记住Internet地址(例如URL /电子邮件)需要一些验证

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

否则它可能无法达到预期的效果。

另请参见

相关问题: