什么是跨域问题,例如你的前端程序和后端程序不在一个域名或端口上,这时你可以使用@CrossOrigin
注解来允许前端应用程序与后端应用程序进行通信。
@CrossOrigin
用于在 Spring Boot 应用程序中启用跨域资源共享(CORS),它可以应用于控制器类或方法上,并指定允许跨域请求的来源、方法和其他选项
CORS 是一种安全机制,用于限制 Web 应用程序中的跨站点 HTTP 请求。默认情况下,浏览器只允许同源请求,即只有来自相同协议、主机和端口的请求才能成功发送。如果尝试从不同源头发出请求,则会收到一个错误,这是浏览器实现的安全功能。
使用 @CrossOrigin
注解可以使 Spring Boot 应用程序接受跨域请求,从而允许来自其他域的客户端访问应用程序的资源。例如,如果你的前端应用程序在一个不同的域名或端口上运行,那么你可以使用 @CrossOrigin
注解来允许前端应用程序与后端应用程序进行通信。
以下是 @CrossOrigin
注解的一些常见属性:
origins
:指定允许跨域请求的来源。可以指定一个或多个来源,例如@CrossOrigin(origins = "http://example.com")
或者@CrossOrigin(origins = {"http://example.com", "http://localhost:8080"})
。methods
:指定允许的 HTTP 方法。默认情况下,允许所有方法(GET、POST、PUT 等)。可以使用@CrossOrigin(methods = RequestMethod.GET)
或者@CrossOrigin(methods = {RequestMethod.GET, RequestMethod.POST})
来指定特定的方法。allowedHeaders
:指定允许的 HTTP 头。默认情况下,允许所有头。可以使用@CrossOrigin(allowedHeaders = "Authorization")
或者@CrossOrigin(allowedHeaders = {"Authorization", "Content-Type"})
来指定特定的头。exposedHeaders
:指定允许客户端访问的响应头。默认情况下,不允许访问任何响应头。可以使用@CrossOrigin(exposedHeaders = "Authorization")
或者@CrossOrigin(exposedHeaders = {"Authorization", "Content-Disposition"})
来指定特定的响应头。allowCredentials
:指定是否允许发送凭据(如 cookie 和 HTTP 认证信息)。默认情况下,不允许发送凭据。可以使用@CrossOrigin(allowCredentials = "true")
来启用凭据发送。
当浏览器发起跨域请求时,如果服务器没有正确配置跨域资源共享(CORS),浏览器会拒绝该请求,并在开发者工具的控制台中报告以下错误之一
- “Access to XMLHttpRequest at ‘http://example.com’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.”:这是最常见的跨域错误,表示服务器未返回正确的
Access-Control-Allow-Origin
响应头,允许来自特定源的请求访问资源。 - “Access to XMLHttpRequest at ‘http://example.com’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: It does not have HTTP ok status.”:这个错误表示服务器未正确处理预检请求(preflight request)。预检请求是一种 OPTIONS 请求,用于检查实际请求是否安全和允许。服务器需要正确响应预检请求并返回正确的 CORS 头。
- “Access to XMLHttpRequest at ‘http://example.com’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: Method GET is not allowed by Access-Control-Allow-Methods in preflight response.”:这个错误表示服务器未正确配置
Access-Control-Allow-Methods
响应头,指定允许的 HTTP 方法。 - “Access to XMLHttpRequest at ‘http://example.com’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: The ‘Access-Control-Allow-Origin’ value ‘http://example.com’ only allows the ‘https’ protocol.”:这个错误表示服务器配置的
Access-Control-Allow-Origin
响应头只允许特定的协议(例如 HTTPS),而请求使用了不同的协议。 - “Failed to load resource: net::ERR_NAME_NOT_RESOLVED”:这个错误表示浏览器无法解析请求的域名。可能是因为域名不存在、DNS 配置错误或网络连接问题。
下面用几个例子简单描述下@CrossOrigin
注解的使用场景
// 允许所有来源的请求
@CrossOrigin
@RestController
public class MyController {
// ...
}
// 指定允许特定来源的请求
@CrossOrigin(origins = "http://example.com")
@RestController
public class MyController {
// ...
}
// 指定允许多个来源的请求
@CrossOrigin(origins = {"http://example.com", "http://localhost:8080"})
@RestController
public class MyController {
// ...
}
// 指定允许特定方法的请求
@CrossOrigin(methods = RequestMethod.GET)
@RestController
public class MyController {
// ...
}
// 指定允许多个方法的请求
@CrossOrigin(methods = {RequestMethod.GET, RequestMethod.POST})
@RestController
public class MyController {
// ...
}
// 指定允许特定头的请求
@CrossOrigin(allowedHeaders = "Authorization")
@RestController
public class MyController {
// ...
}
// 指定允许多个头的请求
@CrossOrigin(allowedHeaders = {"Authorization", "Content-Type"})
@RestController
public class MyController {
// ...
}
// 指定允许客户端访问的响应头
@CrossOrigin(exposedHeaders = "Authorization")
@RestController
public class MyController {
// ...
}
// 指定允许多个响应头
@CrossOrigin(exposedHeaders = {"Authorization", "Content-Disposition"})
@RestController
public class MyController {
// ...
}
// 启用发送凭据(如 cookie 和 HTTP 认证信息)
@CrossOrigin(allowCredentials = "true")
@RestController
public class MyController {
// ...
}