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