@CrossOrigin 注解可以实现对注解的控制器方法的跨域请求,如下例所示:

    1. @RestController
    2. @RequestMapping("/account")
    3. public class AccountController {
    4. @CrossOrigin
    5. @GetMapping("/{id}")
    6. public Account retrieve(@PathVariable Long id) {
    7. // ...
    8. }
    9. @DeleteMapping("/{id}")
    10. public void remove(@PathVariable Long id) {
    11. // ...
    12. }
    13. }

    默认情况下,@CrossOrigin 允许:

    • 所有 origins
    • 所有 headers
    • 所有控制器被映射到 HTTP methods

    allowCredentials 默认不启用,因为这建立了一个信任级别,暴露了敏感的用户特定信息(如 cookies 和 CSRF 令牌),应该只在适当的地方使用。当它被启用时,allowOrigins 必须被设置为一个或多个特定的域(但不是特殊值 "*"),或者可以使用 allowOriginPatterns 属性来匹配一组动态的来源。

    maxAge 被设置为 30 分钟。

    @CrossOrigin 在类的层面上也是支持的,并且被所有的方法所继承,如下例所示:

    1. @CrossOrigin(origins = "https://domain2.com", maxAge = 3600)
    2. @RestController
    3. @RequestMapping("/account")
    4. public class AccountController {
    5. @GetMapping("/{id}")
    6. public Account retrieve(@PathVariable Long id) {
    7. // ...
    8. }
    9. @DeleteMapping("/{id}")
    10. public void remove(@PathVariable Long id) {
    11. // ...
    12. }
    13. }

    你可以在类的层次和方法的层次上使用 @CrossOrigin,如下例所示:

    1. @CrossOrigin(maxAge = 3600)
    2. @RestController
    3. @RequestMapping("/account")
    4. public class AccountController {
    5. @CrossOrigin("https://domain2.com")
    6. @GetMapping("/{id}")
    7. public Account retrieve(@PathVariable Long id) {
    8. // ...
    9. }
    10. @DeleteMapping("/{id}")
    11. public void remove(@PathVariable Long id) {
    12. // ...
    13. }
    14. }

    下面是使用默认的 @CrossOrigin 后,响应的头信息
    image.png