【问题标题】:Does Spring @RestController enable CORS by default?Spring @RestController 默认启用 CORS 吗?
【发布时间】:2017-02-14 09:38:42
【问题描述】:

我正在阅读这个Spring security tutorial,它提到我们可能会看到 2 个动态资源请求,因为这个控制器有一个 CORS 协商:

    @SpringBootApplication
    @RestController
    public class UiApplication {

      @RequestMapping("/resource")
      public Map<String,Object> home() {
        Map<String,Object> model = new HashMap<String,Object>();
        model.put("id", UUID.randomUUID().toString());
        model.put("content", "Hello World");
        return model;
      }

      public static void main(String[] args) {
        SpringApplication.run(UiApplication.class, args);
      }

    }

只是好奇@RestController注解是否默认启用CORS?

【问题讨论】:

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


    【解决方案1】:

    您需要自己添加@CrossOrigin注解才能在Spring中获得CORS支持。

    为什么:

    启用 CORS(跨域资源共享默认将是一个严重的安全问题

    考虑official docs 中的这个例子。

    出于安全原因,浏览器禁止 AJAX 调用资源 居住在当前原点之外。例如,当您检查 您的银行帐户在一个标签中,您可以打开 evil.com 网站 在另一个选项卡中。 evil.com 的脚本应该能够制作 向您的银行 API 发出的 AJAX 请求(例如,提款 帐户!)使用您的凭据。

    【讨论】:

    • 所以只是好奇......如果控制器未启用 CORS,是否可以为控制器进行 CORS 协商?
    【解决方案2】:

    不,见https://spring.io/guides/gs/rest-service-cors/

    这样 RESTful Web 服务将包含 CORS 访问控制 在其响应中添加标题,您只需添加一个 @CrossOrigin 处理程序方法的注释:

    @CrossOrigin(origins = "http://localhost:9000")
    @GetMapping("/greeting")
    public Greeting greeting(@RequestParam(required=false, defaultValue="World") String name) {
       System.out.println("==== in greeting ====");
       return new Greeting(counter.incrementAndGet(), String.format(template, name));
    }
    

    【讨论】:

      【解决方案3】:

      CORS 支持默认是禁用的,只有在endpoints.cors.allowedorigins 属性已设置。下面的配置允许从 example.com 域:

      endpoints.cors.allowed-origins=http://example.com
      endpoints.cors.allowed-methods=GET,POST
      

      Spring boot ref guide.

      查看EndpointCorsProperties 以获取完整的选项列表。

      【讨论】:

      • 对于那些展望未来的人 - 这仅适用于 Spring Actuator - 而不是您的控制器
      【解决方案4】:

      没有。例如,来自 evil.com 的脚本应该无法向您的银行发出 AJAX 请求

      【讨论】:

        猜你喜欢
        • 2018-06-13
        • 2016-07-05
        • 2015-07-09
        • 1970-01-01
        • 2018-09-09
        • 1970-01-01
        • 2020-05-26
        • 2018-06-05
        相关资源
        最近更新 更多