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

时间:2017-03-10 01:38:54

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

我正在使用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}")

关于我做错的任何想法?

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

3 个答案:

答案 0 :(得分:7)

  

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

CORS allowed-origins设置不会阻止您直接在浏览器中打开URL。

浏览器仅对使用XHR或Fetch或jQuery $.ajax(…)的网络应用程序中运行的JavaScript代码施加CORS限制,或者用于制作跨源请求。

因此,CORS不是一种阻止用户直接导航到URL的方法,也不是阻止非{web}客户端,如curl或邮递员或其他任何人访问URL的方法。

答案 1 :(得分:1)

在@CrossOrigin(" http://mydomain.io")中明确指定域为字符串将起作用。我没有'认为这将起作用@CrossOrigin(" $ {endpoints.cors.allowed-originins}")。

答案 2 :(得分:1)

至于我,我在我的应用程序中添加了CrossRef Filter。

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


  }

}