解決springcloud阿裡雲OSS文件訪問跨域問題的實現
引言
最近在高德地圖中引用阿裡雲OSS存儲的圖片時,出現跨域訪問問題,特此記錄,以方便後續同學參考
解決
1、在阿裡雲OSS後臺管理中,進入權限管理,進入跨域設置,添加跨域規則,設置來源為*
2、至此配置完成後訪問圖片還是會出現跨域問題,這是因為OSS文件默認會開啟緩存,及後續訪問的實際上是緩存的文件,這就會導致不能匹配到我們上述配置的跨域規則
於是我們需要將緩存禁用掉,如果文件就一兩個的話,可以直接在後臺中設置禁用緩存,將HTTP頭中Cache-Control
設置為no-cache
3、因為目前阿裡雲後臺隻支持單個文件的HTTP頭設置,並不支持批量設置,所以到有多個文件或者後續上傳的文件都不需要緩存時就不能滿足瞭
那麼我們如何來實現這個批量禁用緩存的需求呢。答案就是在上傳文件到OSS的時候在請求頭中設置Cache-Control
為no-cache
首先上傳阿裡雲OSS的接口是基於aliyun-sdk-oss
依賴的
<dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> </dependency>
其次我們觀察該依賴包提供的上傳文件接口,會發現其中有一個方法可以設置ObjectMetadata
而ObjectMetadata
中是可以設置Header的
那麼解決的方法就很清晰瞭,我們隻需要在調用該文件上傳put
方法時,在ObjectMetadata中設置上我們需要的Header即可,參考代碼如下:
private final OSSClient ossClient; @PostMapping("/put-file-with-nocache") public PutObjectResult putFileWithNoCache(@RequestParam MultipartFile file) { String fileName = file.getOriginalFilename(); ObjectMetadata metadata = new ObjectMetadata(); // 取消文件緩存,文件每次都會從OSS服務器獲取 metadata.setHeader("Cache-Control", "no-cache"); metadata.setHeader("Expires", "0"); PutObjectResult bucketName = ossClient.putObject("bucketName", fileName, file.getInputStream(), metadata); return bucketName; }
之後通過該接口上傳的圖片就不會再有跨域問題瞭,我們在測試工具中調用訪問該圖片,也會發現其response中會多出一個cache-control: no-cache
的響應頭瞭。
到此這篇關於解決springcloud阿裡雲OSS文件訪問跨域問題的實現的文章就介紹到這瞭,更多相關springcloud OSS文件跨域內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Springboot集成阿裡雲OSS上傳文件系統教程
- 基於HTTP瀏覽器緩存機制全面解析
- WebUploader實現圖片上傳功能
- php文件下載後無法打開的處理方案及代碼
- 淺談Django 頁面緩存的cache_key是如何生成的