java - 将字符串从客户端传输到服务器时出现垃圾值

标签 java xml base64

这是我在客户端中的字符串:

<?xml version="1.0" encoding="UTF-8"?><samlp
:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" AssertionConsum
erServiceURL="http://172.16.32.160:8080/ration/consumer.jsp" ID="3dece98b-f89d-4
b59-b7ed-5f278aa56eb0" IssueInstant="2012-04-14T12:47:36" ProtocolBinding="urn:o
asis:names:tc:SAML:2.0:bindings:HTTP-POST" Version="2.0" destination="http://172
.16.32.160:8080/ration/EFORMS/service1level1.html" level="level1"><saml:Issuer x
mlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">http://172.16.32.160:8080/rati
on/SProvider.jsp</saml:Issuer><samlp:NameIDPolicy AllowCreate="true" Format="urn
:oasis:names:tc:SAML:2.0:nameid-format:unspecified"/><samlp:RequestedAuthnContex
t Comparison="exact"/><saml:AuthnContextClassRef xmlns:saml="urn:oasis:names:tc:
SAML:2.0:assertion">urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTran
sport</saml:AuthnContextClassRef><Signature xmlns="http://www.w3.org/2000/09/xml
dsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/
xml-exc-c14n#"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rs
a-sha1"/><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2
000/09/xmldsig#enveloped-signature"/></Transforms><DigestMethod Algorithm="http:
//www.w3.org/2001/04/xmlenc#sha256"/><DigestValue>ZrvAtwVXohf0JrjGzWlBt9gt9SNESE
Id6lZuU4iOZkg=</DigestValue></Reference></SignedInfo><SignatureValue>M62OPXOZ8nR
zIDjFcTgBTnYSzZdrjwHL6p93wbpSYHZgBOUD4EZgt47GhtFAVU3oVga5VLt5yK+j
hBvEVtaj2/bKIvFfXDpnOuXKNlsKtdu140iMUMdxRvnMyh8enx77YhUlSl2VCQ0NnYnk3gs4H8QE
qmeorwXsthtjUMTKqAw=</SignatureValue></Signature></samlp:AuthnRequest>


我已经使用傻瓜代码对其进行了编码:

byte[] q3=Base64.encodeBase64(xmlString.getBytes("utf-8"));
        String xmlString1=new String(q3,"utf-8");

在服务器中,我首先使用以下内容进行解码:

byte[] decoded = Base64.decodeBase64(result.getBytes("utf-8"));
                String result10=new String(decoded,"utf-8");


结果包含以下内容:

<?xml version="1.0" encoding="UTF-8"?><samlp:
AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" AssertionConsume
rServiceURL="http://172.16.32.160:8080/ration/consumer.jsp" ID="3dece98b-f89d-4b
59-b7ed-5f278aa56eb0" IssueInstant="2012-04-14T12:47:36" ProtocolBinding="urn:oa
sis:names:tc:SAML:2.0:bindings:HTTP-POST" Version="2.0" destination="http://172.
16.32.160:8080/ration/EFORMS/service1level1.html" level="level1"><saml:Issuer xm
lns:saml="urn:oasis:names:tc:SAML:2.0:assertion">http://172.16.32.160:8080/ratio
n/SProvider.jsp</saml:Issuer><samlp:NameIDPolicy AllowCreate="true" Format="urn:
oasis:names:tc:SAML:2.0:nameid-format:unspecified"/☼∟?[[∟♫??\]Y\?↓Y►]]→←???↓►??\
↑\?\??H?^↑X??∟?[[♫?]]→←???↓^↔►?↑\??Y?▲←[←???[[☼H?\????\?\??[Y\?↑??SS♫???♫?\??\?→
[???\????\?\??[Y\?↑??SS♫???♫?X??↑\??\?↑\????¶∟??↓X?↓Y§∟?[??←?☼♂??[[♫?]]→←???↓^↔►
?↑\??Y??¶?Y?]↔\?H▲←[←??H?↔↔∟♫???????????♀♀♂?♫K?←[↓∟?Y???¶?Y?Y↕[???►?[??X?[→^?]→[
?Y]→►[↓??]→←OH?↔↔∟♫???????????♀♀K?L♂?←[♂Y^↑?X?M←????6?v?↨GW&T?WF??B♦▬?v?&?F???&?
GG♥???wwr?s2??&r?#♥♥☻?♥?????G6?r7'6↕?6?‼↕"???&VfW&V?6R♣U$??"#??G&▬?6f?&?3??G&▬?6
f?&?♦▬?v?&?F???&?GG♥???wwr?s2??&r?#♥♥☻?♥?????G6?r6V?fV??♠VB?6?v?↨GW&R"????G&▬?6f
?&?3??F?vW7D?WF??B♦▬?v?&?F???&?GG♥???wwr?s2??&r?#♥♥↕?♥B????V?276?‼#Sb"??◄?????Y?
???i??♣??Ya????)?↔?]?   ????M9§M§%??i?T?=i????◄?????Y?????I?????????M?????%???<S
ignatureValue>M62OPXOZ8nRzIDjFcTgBTnYSzZdrjwHL6p93wbpSYHZgBOUD4EZgt47GhtFAVU3oVg
a5VLt5yK+j
hBvEVtaj2/bKIvFfXDpnOuXKNlsKtdu140iMUMdxRvnMyh8enx77YhUlSl2VCQ0NnYnk3gs4H8QE
qmeorwXsthtjUMTKqAw=</SignatureValue></Signature></samlp:AuthnRequest><br>


正如您所看到的,中间部分插入了垃圾值。但文档的其余部分中没有不存在的字符。为什么那部分单独具有垃圾值(value)?
编辑
我使用以下代码发送 xmlString。

String reqString = "http://172.16.32.160:8080/saml/IDProvider"+"?SAMLRequest=" + xmlString1;

        resp.sendRedirect(reqString);


在我正在使用的服务器中

String result=req.getParameter("SAMLRequest");
                byte[] decoded = Base64.decodeBase64(result.getBytes("utf-8"));
                String result10=new String(decoded,"utf-8");

最佳答案

原则上是正确的;你也可以这样做(如你所知):

发送:

byte[] q3=Base64.encodeBase64(xmlString.getBytes("utf-8"));
String xmlString1=new String(q3,"US-ASCII");

接收:

byte[] decoded = Base64.decodeBase64(result.getBytes("US-ASCII"));
String result10=new String(decoded,"utf-8");

我认为这是传输:Base64 给出 A-z0-9 和 +/。您可能必须替换 + 和/。此外,可能会生成空格/换行符,也必须对其进行处理。在传输过程中,空格可能会变成 +。

不太可能出现的错误是将 header 中的内容长度设置为原始大小 (6/8),而不是编码长度。

如果您查看编码结果,您可能会自己看到它。编码为正确的内容 + 一个字符。

关于java - 将字符串从客户端传输到服务器时出现垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10151830/

相关文章:

java - 我在 Selenium 中的 @Test 方法运行了两次

java - ServiceLoader 不加载新服务

android - 里面有 & 的 xml 字符串

node.js - 使用 Node.js 将 Base64 图像从 IOS 上传到 S3

Java缩略图库: IIOException occurred : Error reading PNG metadata

java - 推断 Java 泛型接口(interface)中类参数的类型

java - 我的公司如何将 jar 放入 Maven 存储库中,以便 Maven 项目可以从内部访问它

python - 使用 ElementTree 从文件夹中读取多个 xml 文件

c# - "Value cannot be null"从一个或多个值为 null 的属性创建 XElement 时

android - 无需压缩即可将位图编码和解码为字节数组