3

EncodeFor应该使用哪个location()

如果我想通过位置推送一些数据,它应该是什么样子?

location("obtainBDK.cfm?message=#ErrorMessage#", false); // nothing

或者

location("obtainBDK.cfm?message=#EncodeForHTMLAttribute(ErrorMessage)#", false);

或者

location("obtainBDK.cfm?message=#EncodeForURL(ErrorMessage)#", false);

或者

还有什么?

4

1 回答 1

4

cflocation/location设置LocationHTTP 标头。浏览器读取这个值并通过 HTTP GET 请求提到的资源。所述URI应该被编码。

现在唯一需要编码的 URI 部分是查询字符串,它以问号开头?。每个键值对由编码键、等号=和编码值组成。多对由 & 号分隔&

根据RFC 1738

因此,只有字母数字、特殊字符“$-_.+!*'()”和用于其保留目的的保留字符可以在 URL 中未编码地使用。

保留字符示例

未编码的 URI:
http://example.org/path?&=&&===&?

预期的键值对:

- "&": "&"
- "=": "="
- "?": ""

但是,正确的解析器只会看到空的键和值。我们需要对键和值进行编码,这样它们就不会出于技术目的而被处理。

编码的 URI: http://example.org/path?%26=%26&%3D=%3D&%3F&%20=%20!

现在 key 和 value 中的所有字符都根据RFC 3986进行了百分比编码,解析器不会弄错。

冷融合:

kvps = [];

key = "message";
val = ErrorMessage;
kvps.append(
    urlEncodedFormat(key) & "=" & urlEncodedFormat(val)
);

targetUrl = "btainBDK.cfm?" & arrayToList(kvps, "&");
location(targetUrl, false);

urlEncodedFormat 与 encodeForUrl

虽然...

Adobe 建议您使用 EncodeForURL 函数而不是 URLEncodedFormat 函数来转义字符串中的特殊字符,以便在所有新应用程序的 URL 中使用。

我遇到了+无法正确区分是空格还是实际加号的问题,尤其是在上下文更改时(CF <-> JS)。urlEncodedFormat因此,无论 Adob​​e 对此有何看法,我都会推荐。

于 2018-10-10T00:09:38.080 回答