📅  最后修改于: 2023-12-03 15:00:02.279000             🧑  作者: Mango
CORS(跨域资源共享)是一种用于 Web 应用程序的机制,用于允许一个 Web 首页的代码或 JavaScript 获得不在同一来源(域、端口或协议)下的访问权限。
在 Spring 中,有多种方法和类可用于处理 CORS。
您可以通过配置 CorsRegistry
对象来启用 CORS。您只需要创建一个带有 @Configuration
注释的类,并在其中使用 addMapping()
方法来指定您希望允许跨域的端点和 HTTP 方法,并配置要使用的跨域设置。
@Configuration
public class CorsConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.maxAge(3600);
}
};
}
}
在上面的示例中,我们定义了一个 /api/**
端点,它允许任何来源(allowedOrigins("*")
)的 HTTP GET、POST、PUT 和 DELETE 请求(allowedMethods("GET", "POST", "PUT", "DELETE")
),允许任何标头(allowedHeaders("*")
),并设置了 Max-Age 为一小时(maxAge(3600)
)。
您还可以使用 @CrossOrigin
注释来指定允许跨域请求的方式和源。您可以将此注释用于控制器方法或控制器类。
@RestController
@CrossOrigin(origins = "*", methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE})
public class UserController {
@GetMapping("/users")
public List<User> getUsers() {
// ...
}
@PostMapping("/users")
public User createUser(@RequestBody User user) {
// ...
}
}
在上面的示例中,我们定义了一个 REST API,它允许任何来源的 HTTP GET、POST、PUT 和 DELETE 请求。
在旧版本的 Spring 中,您可以使用 WebMvcConfigurerAdapter
来配置 CORS。但是,WebMvcConfigurerAdapter
在 Spring 5.0 中已被弃用。
@Configuration
public class CorsConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.maxAge(3600);
}
}
在上面的示例中,我们定义了一个 /api/**
端点,它允许任何来源的 HTTP GET、POST、PUT 和 DELETE 请求。
如果您使用的是 Servlet API,则可以使用 CorsFilter
来处理 CORS。CorsFilter
是一个简单的过滤器,它允许您轻松地处理跨域请求。
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(req, res);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// ...
}
@Override
public void destroy() {
// ...
}
}
在上面的示例中,我们定义了一个 CorsFilter
过滤器,它允许任何来源的 HTTP GET、POST、PUT 和 DELETE 请求,允许授权标头和内容类型标头。
在本文中,我们提供了几种用于处理 CORS 的方法和类。您可以选择适合自己的方式来启用跨域请求。无论您选择哪种方式,都应该主动考虑安全性问题。如果您允许来自任何来源的跨域请求,在某些情况下可能会导致安全漏洞。