引言
最近在高德地圖中引用阿里云OSS存儲(chǔ)的圖片時(shí),出現(xiàn)跨域訪問(wèn)問(wèn)題,特此記錄,以方便后續(xù)同學(xué)參考
解決
1、在阿里云OSS后臺(tái)管理中,進(jìn)入權(quán)限管理,進(jìn)入跨域設(shè)置,添加跨域規(guī)則,設(shè)置來(lái)源為*
圖片來(lái)源于https://blog.csdn.net/strugglerookie/article/details/119417281
2、至此配置完成后訪問(wèn)圖片還是會(huì)出現(xiàn)跨域問(wèn)題,這是因?yàn)镺SS文件默認(rèn)會(huì)開(kāi)啟緩存,及后續(xù)訪問(wèn)的實(shí)際上是緩存的文件,這就會(huì)導(dǎo)致不能匹配到我們上述配置的跨域規(guī)則
于是我們需要將緩存禁用掉,如果文件就一兩個(gè)的話,可以直接在后臺(tái)中設(shè)置禁用緩存,將HTTP頭中Cache-Control
設(shè)置為no-cache
3、因?yàn)槟壳鞍⒗镌坪笈_(tái)只支持單個(gè)文件的HTTP頭設(shè)置,并不支持批量設(shè)置,所以到有多個(gè)文件或者后續(xù)上傳的文件都不需要緩存時(shí)就不能滿足了
那么我們?nèi)绾蝸?lái)實(shí)現(xiàn)這個(gè)批量禁用緩存的需求呢。答案就是在上傳文件到OSS的時(shí)候在請(qǐng)求頭中設(shè)置Cache-Control
為no-cache
首先上傳阿里云OSS的接口是基于aliyun-sdk-oss
依賴的
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
其次我們觀察該依賴包提供的上傳文件接口,會(huì)發(fā)現(xiàn)其中有一個(gè)方法可以設(shè)置ObjectMetadata
而ObjectMetadata
中是可以設(shè)置Header的
那么解決的方法就很清晰了,我們只需要在調(diào)用該文件上傳put
方法時(shí),在ObjectMetadata中設(shè)置上我們需要的Header即可,參考代碼如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-789913.html
private final OSSClient ossClient;
@PostMapping("/put-file-with-nocache")
public PutObjectResult putFileWithNoCache(@RequestParam MultipartFile file) {
String fileName = file.getOriginalFilename();
ObjectMetadata metadata = new ObjectMetadata();
// 取消文件緩存,文件每次都會(huì)從OSS服務(wù)器獲取
metadata.setHeader("Cache-Control", "no-cache");
metadata.setHeader("Expires", "0");
PutObjectResult bucketName = ossClient.putObject("bucketName", fileName, file.getInputStream(), metadata);
return bucketName;
}
之后通過(guò)該接口上傳的圖片就不會(huì)再有跨域問(wèn)題了,我們?cè)跍y(cè)試工具中調(diào)用訪問(wèn)該圖片,也會(huì)發(fā)現(xiàn)其response中會(huì)多出一個(gè)cache-control: no-cache
的響應(yīng)頭了。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-789913.html
到了這里,關(guān)于springcloud:解決阿里云OSS文件訪問(wèn)跨域問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!