解決springcloud阿裡雲OSS文件訪問跨域問題的實現

引言

最近在高德地圖中引用阿裡雲OSS存儲的圖片時,出現跨域訪問問題,特此記錄,以方便後續同學參考

解決

1、在阿裡雲OSS後臺管理中,進入權限管理,進入跨域設置,添加跨域規則,設置來源為*

2、至此配置完成後訪問圖片還是會出現跨域問題,這是因為OSS文件默認會開啟緩存,及後續訪問的實際上是緩存的文件,這就會導致不能匹配到我們上述配置的跨域規則

於是我們需要將緩存禁用掉,如果文件就一兩個的話,可以直接在後臺中設置禁用緩存,將HTTP頭中Cache-Control設置為no-cache

3、因為目前阿裡雲後臺隻支持單個文件的HTTP頭設置,並不支持批量設置,所以到有多個文件或者後續上傳的文件都不需要緩存時就不能滿足瞭

那麼我們如何來實現這個批量禁用緩存的需求呢。答案就是在上傳文件到OSS的時候在請求頭中設置Cache-Controlno-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!

推薦閱讀: