阿里雲OSS跨域

如果不考慮CDN迴流的話。

對於跨域,需要請求協議、域名、端口3者有1個不同,即是跨域。

那麼怎麼解決跨域,原始方法是JSONP,那個時代技術有限,現在都是Cors技術。

現在,前端發給後端,後端例如golang可以如下配置:

當然,具體用法見官方文檔。

然後就是vue開發階段,我的訪問url是localhost:3000.

 

 前端直傳oss,爲了分佈式考慮,跨域訪問了。

那麼,這時可以在阿里雲的oss管理界面設置js跨域規則:

 我這裏就簡單粗暴點了:

 

然後前端重新請求:

 

這裏實際上後端對OSS是做了處理的:

 

package service

import (
	"giligili/serializer"
	"mime"
	"os"
	"path/filepath"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"github.com/google/uuid"
)

// UploadTokenService 獲得上傳oss token的服務
type UploadTokenService struct {
	Filename string `form:"filename" json:"filename"`
}
/**
簽名保證私有,且阿里雲的bucket中我手動配置了防盜鏈和私有bucket,不用擔心別人吃我流量。
 */
// Post 創建token
func (service *UploadTokenService) Post() serializer.Response {
	client, err := oss.New(os.Getenv("OSS_END_POINT"), os.Getenv("OSS_ACCESS_KEY_ID"), os.Getenv("OSS_ACCESS_KEY_SECRET"))
	if err != nil {
		return serializer.Response{
			Status: 50002,
			Msg:    "OSS配置錯誤",
			Error:  err.Error(),
		}
	}

	// 獲取存儲空間。
	bucket, err := client.Bucket(os.Getenv("OSS_BUCKET"))
	if err != nil {
		return serializer.Response{
			Status: 50002,
			Msg:    "OSS配置錯誤",
			Error:  err.Error(),
		}
	}

	// 獲取擴展名
	ext := filepath.Ext(service.Filename)

	// 帶可選參數的簽名直傳。
	options := []oss.Option{
		oss.ContentType(mime.TypeByExtension(ext)),
	}

	// 上傳視頻封面: 通過uuid避免不同人上傳封面覆蓋(同名)
	key := "upload/avatar/" + uuid.Must(uuid.NewRandom()).String() + ext
	// 簽名直傳。
	signedPutURL, err := bucket.SignURL(key, oss.HTTPPut, 600, options...)
	if err != nil {
		return serializer.Response{
			Status: 50002,
			Msg:    "OSS配置錯誤",
			Error:  err.Error(),
		}
	}
	// 查看圖片
	signedGetURL, err := bucket.SignURL(key, oss.HTTPGet, 600)
	if err != nil {
		return serializer.Response{
			Status: 50002,
			Msg:    "OSS配置錯誤",
			Error:  err.Error(),
		}
	}

	return serializer.Response{
		Data: map[string]string{
			"key": key,
			"put": signedPutURL,
			"get": signedGetURL,
		},
	}
}

 

對於oss的bucket,最好設置私有的,

且爲了不要被別人請求而浪費流量可以設置防盜鏈和refer:

 重要的是看response,可以看到如上headers就成功了。

 

OPTIONS請求是“探測”。

是通過OPTIONS請求去探測然後再發真正的請求。

即這2個請求的max-age時間段內發,前端一般是一起發。

MAX-Age: 0 代表無限。

OPTIONS請求不應該像普通的請求(GET POST)一樣做業務處理,而只是負責探測。

子域名也會遵守跨域規則。

golang後端配置前端請求跨域,注意

這裏的origin的協議(http/https)、域名、端口只要1個沒寫對,那麼就掛了。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章