程序中获取到带签名的OSS临时地址,使用RestTemplate直接访问的方式:

String url = "http://xxx/xxx/xxx.jpg?Expires=123&OSSAccessKeyId=xxx&Signature=X%2FtpHD%2BX%2Bvw%3D"";
RestTemplate restTemplate = new RestTemplate();
String object = restTemplate.getForObject(url, String.class);
System.out.println(object);

报错SignatureDoesNotMatch

完整报错信息:

org.springframework.web.client.HttpClientErrorException$Forbidden:
403 Forbidden:
[<?xml version="1.0" encoding="UTF-8"?>
<Error> <Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing... (1104 bytes)]

解决:使用URI.create(url)

String url = "http://xxx/xxx/xxx.jpg?Expires=123&OSSAccessKeyId=xxx&Signature=X%2FtpHD%2BX%2Bvw%3D"";
RestTemplate restTemplate = new RestTemplate();
String object = restTemplate.getForObject(URI.create(url), String.class);
System.out.println(object);

两种方式对比:

场景 URI.create(url) 直接传字符串url
编码处理 按URI规范解析,不二次编码已合法编码的字符(如%3D) 可能对整个字符串进行编码,导致双重编码(如%3D→%253D)
特殊字符兼容性 适合已手动编码或包含保留字符(如=,&)的url 适合未编码的原始字符串(框架自动编码未处理的特殊字符)
参数解析准确性 严格遵循URI各部分语法,避免参数解析错误 依赖框架内部编码逻辑,可能因规则不一致导致错误

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐