在java中的字符串中包含带的串联运算符(+;)

在java中的字符串中包含带的串联运算符(+;),java,angularjs,encryption,aes,Java,Angularjs,Encryption,Aes,我使用“AES”算法对java中包含用户信息的文本进行加密,并将其附加到url(将发送给客户以访问应用程序)。我成功地从客户端的url中检索到加密文本(AngularJS)并通过rest调用将其发送回服务器端(java),对其进行解密并检索相应的信息 但我面临的问题是,由于加密文本包含“+”,Java将其视为一个串联运算符,并将其替换为空格,在解密之前更改原始加密格式 我尝试了encValue=encValue.replaceAll(“\\+”,“\\\\+”),用于 ecryptedText(

我使用“AES”算法对java中包含用户信息的文本进行加密,并将其附加到url(将发送给客户以访问应用程序)。我成功地从客户端的url中检索到加密文本(AngularJS)并通过rest调用将其发送回服务器端(java),对其进行解密并检索相应的信息

但我面临的问题是,由于加密文本包含“+”,Java将其视为一个串联运算符,并将其替换为空格,在解密之前更改原始加密格式

我尝试了
encValue=encValue.replaceAll(“\\+”,“\\\\+”)
,用于

ecryptedText(加密的URL参数以angularJS获取,并将其传递给Java)

a6fPPqUwnkobdB7D8B53en+FlNcEt+Ehd4Ze6srqM/Q=

java中的结果(相同的加密值)

a6fPPqUwnkobdB7D8B53en\\FlNcEt Ehd4Ze6srqM/Q=

我希望加密文本保留其原始结构

多谢各位

但我面临的问题是,由于加密文本包含“+”,我将其视为一个串联运算符

对我来说,这听起来非常、非常不可能。这也不能解释为什么会得到一个空格。相反,这听起来像是一个URL编码问题……通常URL查询参数中的
+
用于编码空格

基本上,您应该使用URL安全的base64编码,或者在将字符串包含在URL中之前通过URL编码器运行字符串

a6fPPqUwnkobdB7D8B53en%2BFlNcEt%2BEhd4Ze6srqM/Q=

因此,正如Jon Skeet所指出的,主要问题是URL编码问题,因为查询参数中的“+”字符是空间的编码形式

因此,仅在AES加密后的Base64编码
a6fPPqUwnkobdB7D8B53en+FlNcEt+Ehd4Ze6srqM/Q=
将在解密文本的过程中导致问题,因为该文本用作URL中的查询参数(因为它在URL查询参数中包含“+”编码形式的空格)

解决方案

在将加密文本实际用作URL查询参数之前,对其执行URL编码

a6fPPqUwnkobdB7D8B53en%2BFlNcEt%2BEhd4Ze6srqM%2FQ%3D

最终,不仅“+”,而且所有特定于URL的字符都将转换为相应的字符集(HTML5中的默认字符集是UTF-8.Check)

一旦您通过JavaScript(客户端)在中获取特定的URL查询参数,就会自动转换为原始文本(这就是我所经历的)


a6fPPqUwnkobdB7D8B53en+FlNcEt+Ehd4Ze6srqM/Q=

作为旁白,当你谈论“Java中的客户端”时,我99%确定你的意思是“Javascript中的客户端”。毕竟,“AngularJS”中的“JS”是针对Javascript的,而不是Java…这完全正确,但因为我发现了Java中的问题,(在rest调用之后,将url参数传递给java),我必须假设我遇到问题的是java,即使问题在java中(事实并非如此),这并不意味着客户端在java中很抱歉,我的错,我已经改成了合适的句子,谢谢UHello@Job Skeet,编码是用java中的base64编码器完成的(java.util.base64)..我已经确保在使用base64进行enrytion和编码后,文本中没有空格隐修会。我甚至在客户端检查空格。但这里的问题是,一旦Java接收到请求,当我打印它时,我会遇到用“+”替换的空格 characters@Nishi:这是一种二进制到文本的编码方式。您试图在URL上使用该文本,因此需要对其进行URL编码。您是否理解URL查询参数中的+是空间的编码形式?对不起,我可能听起来有点傻,但我对此过程很幼稚……那么您的意思是在我加密文本之后,在添加之前如果将它添加到url(公开共享),我应该对该加密文本进行url编码?@Job Skeet,我在加密后尝试了url编码,然后将其放入url中,结果成功了..谢谢你。。。