这是我在客户端中的字符串:
<?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/