CORS 允许来源限制不会导致服务器拒绝请求

Posted

技术标签:

【中文标题】CORS 允许来源限制不会导致服务器拒绝请求【英文标题】:CORS allowed-origin restrictions aren’t causing the server to reject requests 【发布时间】:2017-07-31 05:22:54 【问题描述】:

我使用的是 Spring Boot v1.5.1,看来我对 CORS 来源的限制不起作用。

我的 application.properties 文件包含以下行 (ref1ref2)。

endpoints.cors.allowed-origins=http://mydomain.io

我的 REST 控制器如下所示。

@RestController
@CrossOrigin
@RequestMapping("/api/car")
public class CarCtrl 
  @Autowired
  private CarService carService;

  @GetMapping
  public Car get() 
    return carService.getLatest();
  

但是,当我打开浏览器并输入 http://localhost:8080/api/car 时,我仍然能够访问 REST 端点。

我也尝试如下更改我的注释,但这不起作用。

@CrossOrigin("$endpoints.cors.allowed-origins")

关于我做错了什么有什么想法吗?

请注意,我没有像 post 这样使用 WebMvcConfigurerAdapter。我真的需要扩展这个类来显式控制原点吗?我认为除了属性文件设置之外,@CrossOrigin 注释将能够控制允许的来源(而不是必须以编程方式这样做)。

【问题讨论】:

Cors 在执行 ajax 请求时应用。它不会阻止浏览器直接访问 API url。 WebMvcConfigurerAdapter 用于要应用全局 Cors 策略时,@CrossOrigin 对于单个资源应该足够了。为什么你认为它不起作用?你是怎么检查的? 【参考方案1】:

但是,当我打开浏览器并输入 http://localhost:8080/api/car 时,我仍然能够访问 REST 端点。

CORS 允许来源设置不会导致服务器阻止请求。

而且由于服务器没有阻止请求,因此不会阻止您直接在浏览器中打开 URL。

同源策略是施加跨域限制的原因,同源策略仅适用于在 Web 浏览器中运行的 Web 应用程序中的前端 javascript,并且使用 XHR 或 Fetch 或 jQuery $.ajax(…) 或其他提出跨域请求。

因此,CORS 不是一种导致服务器阻止请求的方法。因此,它也不是阻止用户直接导航到 URL 的方法,也不是阻止任何非 Web 应用程序工具(如 curl 或 Postman 或其他任何东西访问 URL)的方法。

【讨论】:

【参考方案2】:

至于我,我正在我的应用程序上添加交叉引用过滤器。

 package com.alexfrndz.filter;

 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 import org.springframework.web.filter.GenericFilterBean;

 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;


 @Component
 public class SimpleCORSFilter extends GenericFilterBean 

/**
 * The Logger for this class.
 */
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Override
public void doFilter(ServletRequest req, ServletResponse resp,
                     FilterChain chain) throws IOException, ServletException 

    HttpServletResponse response = (HttpServletResponse) resp;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
    //response.setHeader("Access-Control-Allow-Credentials", "true");
    chain.doFilter(req, resp);


  


【讨论】:

【参考方案3】:

在@CrossOrigin("http://mydomain.io") 中将域显式指定为字符串将起作用。我不认为这会起作用@CrossOrigin("$endpoints.cors.allowed-origins")。

【讨论】:

那么如果我不在注解中设置值,那么在application.properties文件中设置的值是否适用于我所有的rest控制器?例如endpoints.cors.allowed-origins? 我不确定,但我认为这会在全球范围内启用 CORS,而且您不必在 REST 控制器中指定 @CrossOrigin。

以上是关于CORS 允许来源限制不会导致服务器拒绝请求的主要内容,如果未能解决你的问题,请参考以下文章

启用 CORS 的服务器不拒绝请求

允许任何 CORS 来源 (*) 时是不是应该设置“Vary: Origin”?

如何限制 Lambda 函数仅响应特定来源?

为啥我的 CORS 配置没有导致服务器过滤传入的请求?如何让服务器只接受来自特定来源的请求?

为啥我的 CORS 配置没有导致服务器过滤传入的请求?如何让服务器只接受来自特定来源的请求?

CORS 缺少允许来源