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

时间:2013-07-08 10:27:58

标签: java encryption struts2

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

3qe80L1ap+cR2zRU9csFwOffw5NtWTueLRYgSXyjctI=

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

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

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

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

3qe80L1ap cR2zRU9csFwOffw5NtWTueLRYgSXyjctI=

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

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

4 个答案:

答案 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安全变体,但如果你没有,那么手动操作就很容易了。