您可以通过 SDK 接口设置跨域访问 CORS(Cross-Origin Resource Sharing)规则,当 TOS 收到跨域请求或 OPTIONS 请求时,会读取存储桶对应的 CORS 规则,进行相应的权限检查并返回相应的 Header,保证跨域传输数据的安全性。本文介绍如何配置桶的跨区域资源共享。
注意
要为桶设置跨域资源共享规则,您必须具备 tos:PutBucketCORS
权限,具体操作请参见权限配置指南。
以下代码用于设置桶 examplebucket
的跨域资源共享规则。
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); // 设置桶的跨域资源共享 PutBucketCORSInput input(bucketName); // 设置跨域资源共享规则 CORSRule rule1; // 指定允许跨域请求的来源。* 表示允许所有请求。 rule1.addAllowedOrigin("*"); // 指定允许跨域请求方法(GET/PUT/POST/DELETE/HEAD) rule1.setAllowedMethods({"GET","PUT"}); // 设置请求可以使用哪些自定义的 HTTP 请求头部 rule1.setAllowedHeaders({"header1", "header2"}); // 设置浏览器可以接收到的来自服务器端的自定义头部信息 rule1.setExposeHeaders({"tos-1", "tos-2"}); // 设置 OPTIONS 请求得到结果的有效期 rule1.setMaxAgeSeconds(100); auto rule2 = CORSRule(); rule2.setAllowedOrigins({"http://example.com", "http://www.volcengine.com"}); rule2.addAllowedMethod("GET"); rule2.addAllowedHeader("header1"); rule2.addExposeHeader("tos-1"); rule2.setMaxAgeSeconds(100); // 设置跨域资源共享规则 std::vector<CORSRule> rules{rule1,rule2}; input.setRules(rules); auto output = client.putBucketCORS(input); if (!output.isSuccess()) { // 异常处理 std::cout << "PutBucketCORS failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "PutBucketCORS success." << std::endl; // 释放网络等资源 CloseClient(); return 0; }
注意
要获取桶的跨域资源共享规则,您必须具备 tos:GetBucketCORS
权限,具体操作请参见权限配置指南。
以下代码用于获取桶 examplebucket
的跨域资源共享规则。
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); // 获取桶的跨域资源共享规则 GetBucketCORSInput input(bucketName); auto output = client.getBucketCORS(input); if (!output.isSuccess()) { // 异常处理 std::cout << "GetBucketCors failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "GetBucketCors success" << std::endl; // 查看跨域访问规则详细信息 for (const auto& rule : output.result().getRules()) { std::cout << "Get Bucket Cors List:" << std::endl; for (auto const& origin : rule.getAllowedOrigins()) { std::cout << "Allowed origin:" << origin << std::endl; } for (auto const& header : rule.getAllowedHeaders()) { std::cout << "Allowed header:" << header << std::endl; } for (auto const& header : rule.getExposeHeaders()) { std::cout << "Expose header:" << header << std::endl; } for (auto const& method : rule.getAllowedMethods()) { std::cout << "Allowed method:" << method << std::endl; } std::cout << "Allowed method:" << rule.getMaxAgeSeconds() << std::endl; } // 释放网络等资源 CloseClient(); return 0; }
注意
要删除桶的跨域资源共享规则,您的账号必须具备tos:PutBucketCORS
权限,具体操作请参见权限配置指南。
以下代码展示如何删除指定桶的跨域资源共享规则。
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); // 删除桶的跨域资源共享 DeleteBucketCORSInput input(bucketName); auto output = client.deleteBucketCORS(input); if (!output.isSuccess()) { // 异常处理 std::cout << "DeleteBucketCORS failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "DeleteBucketCORS success." << std::endl; // 释放网络等资源 CloseClient(); return 0; }
关于跨域资源共享的更多信息,请参见跨域访问设置。