【问题标题】:CORS allowed-origin restrictions aren’t causing the server to reject requestsCORS 允许来源限制不会导致服务器拒绝请求
【发布时间】: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 对于单个资源应该足够了。为什么你认为它不起作用?你是怎么检查的?

标签: java spring spring-mvc spring-boot cors


【解决方案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。
      猜你喜欢
      • 2018-07-28
      • 2017-12-17
      • 2019-10-10
      • 2020-12-29
      • 2023-02-14
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      • 2013-07-16
      相关资源
      最近更新 更多