我正在做一个SAML请求,它有一个名为" SAMLRequest"的base64编码参数。问题是" +"字符没有得到URL编码(它适用于其他字符,如" =")。当在服务器上收到请求时,它被认为是无效的文档,因为所有" +"人物现在是空间" "字符。
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_XML);
String base64SamlRequest = Base64.encode(... some payload ...);
HttpEntity<Object> httpEntity = new HttpEntity<>(base64SamlRequest, headers);
restTemplate.exchange(endpoint+"&SAMLRequest="+base64SamlRequest, method, httpEntity, String.class);
我还尝试使用SAMLRequest={base64SamlRequest}
进行模板化,作为网址的一部分。
restTemplate.exchange(endpoint, method, httpEntity, String.class, base64SamlRequest);
启用日志记录logging.level.org.apache.http=DEBUG
我可以看到+
字符是url参数中的纯文本(未编码)。
如何强制对这些进行编码?或者我可以在上面的代码中对其进行更改以正确编码吗?
答案 0 :(得分:0)
进行URL的Base64编码字符串操作的最佳Spring实践是使用Spring的Base64Utils:
Linkered/Envoy
这可确保在编码过程中所有字符都能正确转义。
请参阅Spring-Boot管理控制台代码中的this example。
有关详细信息,请参阅Base64Utils source,其中使用Base64#getUrlEncoder对字符串进行编码。
答案 1 :(得分:0)
我现在已经解决了这个问题。事实证明,我需要模拟SAML请求的表单提交。 URL编码表单数据的规则是不同的。
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
String base64SamlRequest = Base64Utils.encodeToString(authnRequest.getBytes());
MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>();
form.add("username", "user");
form.add("password", "password");
form.add("SAMLRequest", base64SamlRequest);
HttpEntity<Object> httpEntity = new HttpEntity<>(form, headers);
ResponseEntity<String> response = restTemplate.postForEntity(endpoint, httpEntity, String.class);