@CrossOrigin 注解可以实现对注解的控制器方法的跨域请求,如下例所示:
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
默认情况下,@CrossOrigin 允许:
- 所有 origins
- 所有 headers
- 所有控制器被映射到 HTTP methods
allowCredentials 默认不启用,因为这建立了一个信任级别,暴露了敏感的用户特定信息(如 cookies 和 CSRF 令牌),应该只在适当的地方使用。当它被启用时,allowOrigins 必须被设置为一个或多个特定的域(但不是特殊值 "*"
),或者可以使用 allowOriginPatterns 属性来匹配一组动态的来源。
maxAge 被设置为 30 分钟。
@CrossOrigin 在类的层面上也是支持的,并且被所有的方法所继承,如下例所示:
@CrossOrigin(origins = "https://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
你可以在类的层次和方法的层次上使用 @CrossOrigin,如下例所示:
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin("https://domain2.com")
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
下面是使用默认的 @CrossOrigin 后,响应的头信息