我使用
BasicTextEncryptor
加密文本“再见,朋友”。所以加密值如下所示,
3qe80L1ap+cR2zRU9csFwOffw5NtWTueLRYgSXyjctI=
然后,我通过电子邮件将 URL 发送给用户,其中上述参数作为令牌。
然后,用户复制以下 URL 并按 Enter,
http://localhost:8080/token=3qe80L1ap+cR2zRU9csFwOffw5NtWTueLRYgSXyjctI=
但是,当我通过操作方法访问 Struts 2 应用程序中的参数时,它会给出如下加密参数,
3qe80L1ap cR2zRU9csFwOffw5NtWTueLRYgSXyjctI=
+
替换为 " "
。所以,当我解密它时,它给了我EncryptionOperationNotPossibleException
。
假设浏览器
+
是编码字符,Struts 是否会将 " "
解码为 +
?在这种情况下,没关系,在继续解密之前,我将空格替换为 +
?
更好的方法是在将字符串附加到实际 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 应用程序将收到正确的解码字符串。
您不需要将 base64 编码的字符串放在那里,而是使用 UrlEncoder 对其进行编码,如下所示:
URLEncoder.encode("3qe80L1ap+cR2zRU9csFwOffw5NtWTueLRYgSXyjctI=", "UTF-8")
这样你就可以将其放入链接中。
考虑使用所谓的 URL safe 的 Base64 变体。 RFC 4648 中描述的最常见变体分别使用
-
和 _
代替 +
和 /
,并省略填充字符 (=
)。
Base64 的大多数实现也支持此 URL 安全变体,但如果您的不支持,手动执行也很容易。