在action类中处理时获取参数+替换为空格

问题描述 投票:0回答:4

我使用

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

3qe80L1ap+cR2zRU9csFwOffw5NtWTueLRYgSXyjctI=

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

然后,用户复制以下 URL 并按 Enter,

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

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

3qe80L1ap cR2zRU9csFwOffw5NtWTueLRYgSXyjctI=

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

假设浏览器

+
是编码字符,Struts 是否会将
" "
解码为
+
?在这种情况下,没关系,在继续解密之前,我将空格替换为
+
?

java url encryption struts2 urlencode
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 应用程序将收到正确的解码字符串。


3
投票

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

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

这样你就可以将其放入链接中。


0
投票

考虑使用所谓的 URL safe 的 Base64 变体。 RFC 4648 中描述的最常见变体分别使用

-
_
代替
+
/
,并省略填充字符 (
=
)。

Base64 的大多数实现也支持此 URL 安全变体,但如果您的不支持,手动执行也很容易。


0
投票

URL 不能包含空格。 URL 编码通常用

+
符号替换空格。

因此服务器可以正常解码

+
符号到空间。请参阅 URLEncoder 文档或阅读 查询字符串参数的 Java URL 编码

© www.soinside.com 2019 - 2024. All rights reserved.