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

IT小君   2021-10-08T03:25:19

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

我的 application.properties 文件有以下行(ref1 ref2)。

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}")

关于我做错了什么的任何想法?

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

评论(3)
IT小君

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

CORS allowed-origins 设置不会导致服务器阻止请求。

并且因为服务器不会阻止请求,所以不会阻止您直接在浏览器中打开 URL。

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

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

2021-10-08T03:25:19   回复
IT小君

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

2021-10-08T03:25:19   回复
IT小君

至于我,我正在我的应用程序中添加 s CrossRef 过滤器。

 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);


  }

}
2021-10-08T03:25:20   回复