3

我使用 . 加密文本“再见,朋友” BasicTextEncryptor。所以加密值如下所示,

3qe80L1ap+cR2zRU9csFwOffw5NtWTueLRYgSXyjctI=

然后我通过电子邮件将 URL 发送给用户,其中上述参数作为令牌。

然后用户复制下面的 URL 并按下回车键,

http://localhost:8080/token=3qe80L1ap+cR2zRU9csFwOffw5NtWTueLRYgSXyjctI=

但是当我通过 action 方法访问 Struts 2 应用程序中的参数时,它给了我如下加密参数,

3qe80L1ap cR2zRU9csFwOffw5NtWTueLRYgSXyjctI=

+替换为" "。所以当我解密它时,它给了我EncryptionOperationNotPossibleException.

假设浏览器是编码字符+,struts 会解码吗?在这种情况下,在我继续解密之前可以,我将空格替换为?" "++

4

4 回答 4

7

更好的方法是在将字符串附加到实际 URL 之前对字符串进行“URL 编码”。

URLEncoder.encode("3qe80L1ap+cR2zRU9csFwOffw5NtWTueLRYgSXyjctI=", "ISO-8859-1");

这将确保令牌被正确解码。

为了回答您的问题,struts 在解码 URL 参数时没有任何作用。它是应用服务器对 URL 参数进行解码的核心功能。因此,每个 HTTP 参数在到达应用程序代码之前都要经过解码。

服务器解码的任何内容都可供应用程序使用(即在您的情况下为 Struts。)

现在解释为什么+没有达到你的支柱。

java.net.URLDecoder.decode("3qe80L1ap+cR2zRU9csFwOffw5NtWTueLRYgSXyjctI="));

它返回3qe80L1ap cR2zRU9csFwOffw5NtWTueLRYgSXyjctI=

这意味着+没有得到 URL 解码。

因此,重申一下,每个 HTTP 参数(查询字符串或表单 POST)在到达应用程序代码之前都要经过解码。

当您对字符串进行 URL 编码时,+将被编码为%2B,并且您的 struts 应用程序将收到正确的解码字符串。

于 2013-07-08T10:35:17.397 回答
3

您不需要将 base64 编码的字符串放在那里,而是使用 UrlEncoder 对其进行编码,如下所示:

URLEncoder.encode("3qe80L1ap+cR2zRU9csFwOffw5NtWTueLRYgSXyjctI=", "UTF-8")

这样你就可以把它放在链接中。

于 2013-07-08T10:35:34.197 回答
0

URL 不能包含空格。URL 编码通常用+符号替换空格。

从而服务器通常解码+到空间符号。请参阅URLEncoder文档或阅读查询字符串参数的 Java URL 编码

于 2013-07-08T11:06:59.293 回答
0

考虑使用 Base64 的所谓URL 安全变体。RFC 4648 中描述的最常见变体分别使用-and_代替+and/并省略填充字符 ( =)。

Base64 的大多数实现也支持这种 URL 安全变体,但如果您的不支持,手动操作也很容易。

于 2013-07-09T19:35:11.953 回答