CORS 问题从 s3 调用 ec2

Posted

技术标签:

【中文标题】CORS 问题从 s3 调用 ec2【英文标题】:CORS Issue calling ec2 from s3 【发布时间】:2019-02-21 18:12:42 【问题描述】:

我在从 s3 调用 ec2 时遇到以下核心问题。我正在尝试从 s3 向 ec2 打一个休息电话。

OPTIONS http://ec2-18-222-201-68.us-east-2.compute.amazonaws.com:8080/register 403 ()

registration.html:1 Failed to load http://ec2-18-222-201-68.us-east-2.compute.amazonaws.com:8080/register: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://htmlcode.s3-website.us-east-2.amazonaws.com' is therefore not allowed access.

以下是我在 s3 存储桶中的 CORS 设置

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>10000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

我还在我的 ec2 springboot jar 文件中设置了 CORS 过滤器,并带有必要的标头。我该如何解决这个问题。

下面是我的核心过滤器

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter extends GenericFilterBean implements Filter 

    public CorsFilter() 
        super();
       

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException 

        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization, content-type");
        response.setHeader("Access-Control-Expose-Headers", "authorization");

        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) 
            response.setStatus(HttpServletResponse.SC_OK);
         else 
            filterChain.doFilter(servletRequest, servletResponse);
        
    

    @Override
    public void destroy() 

    


【问题讨论】:

【参考方案1】:

您的回复说"Access-Control-Allow-Origin" 不存在,因此您需要确保您的 ec2 端 jar 将此标头作为对预检请求的响应发回,并且值应与您的请求来源 (ec2) 域名匹配。

在我的例子中,我使用的是 spring RestController,下面使用类级别的注释来允许所有域:

@CrossOrigin("*")

【讨论】:

用我的 cors 过滤器编辑了问题。这有什么问题吗? 修复了我的问题

以上是关于CORS 问题从 s3 调用 ec2的主要内容,如果未能解决你的问题,请参考以下文章

被 CORS 策略阻止:从 Amazon S3 调用图像时没有“Access-Control-Allow-Origin”标头

无法通过 Cloudfront 从 EC2 解码 CORS 压缩内容

EC2 TOMCAT 7 上的 CORS

不带 CORS 直接上传到 S3(非浏览器)

CORS 上传文件到 S3,得到 SignatureDoesNotMatch 错误

S3 被 CORS 策略阻止