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 来源 (*) 时是不是应该设置“Vary: Origin”?
为啥我的 CORS 配置没有导致服务器过滤传入的请求?如何让服务器只接受来自特定来源的请求?