跨域资源共享(Cross-origin resource sharing,简称CORS),用于让网页的受限资源能够被其他域名的页面访问的一种机制。通过该机制,页面能够自由地使用不同域名(cross-origin)的图片、样式、脚本、iframes以及视频。 ——维基百科
HTTP访问控制(CORS) - HTTP | MDN
跨域资源共享CORS 详解- 阮一峰的网络日志
跨域资源共享(CORS)详解
CORS
简单请求和非简单请求
只要同时满足以下两大条件,就属于简单请求:
(1)请求方法是以下三种方法之一:
(2)HTTP的头信息不超出以下几种字段:
- Accept
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type:只限于三个值
application/x-www-form-urlencoded
、multipart/form-data
、text/plain
Spring 项目中配置 CORS
Enabling Cross Origin Requests for a RESTful Web Service | Spring
CORS support in Spring Framework | Spring
自定义过滤器
1 2 3 4 5 6 7 8 9 10 11 12
| @Configuration public class FilterRegisterConfig {
@Bean public FilterRegistrationBean filterRegisterBean() { FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new CorsFilter()); registrationBean.setUrlPatterns(new ArrayList<String>() {{ add("*"); }}); return registrationBean; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Configuration @WebFilter(urlPatterns = "*") public class CorsFilter implements Filter {
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) servletResponse; response.setHeader("Access-Control-Allow-Origin", "http://localhost:9528"); response.setHeader("Access-Control-Max-Age", "10"); response.setHeader("Access-Control-Allow-Methods", "*"); response.setHeader("Access-Control-Allow-Headers", "*"); filterChain.doFilter(servletRequest, servletResponse); } }
|
Access-Control-Allow-Methods
该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的请求类型。
Access-Control-Allow-Headers
如果浏览器请求包括Access-Control-Request-Headers
字段,则Access-Control-Allow-Headers
字段是必需的。它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在”预检”中请求的字段。
Access-Control-Max-Age
该字段可选,用来指定本次预检请求的有效期,单位为秒。上面结果中,有效期是 10秒,即允许缓存该条回应 10 秒,在此期间,不用发出另一条预检请求。
注意:如果设置缓存后,发现每次还是会发送 OPTIONS 请求,请检查是不是勾选了“禁止缓存”。
注解 @CrossOrigin
1 2 3 4 5 6 7 8 9 10
| @CrossOrigin(origins = "http://localhost:9528", maxAge = 10) @RestController public class CorsController {
@PostMapping("cors") public String cors() { return "success"; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @RestController public class CorsController { @CrossOrigin(origins = "http://localhost:9528", maxAge = 10) @PostMapping("cors") public String cors() { return "cors"; }
@PostMapping("cors2") public String cors2(){ return "cors2"; } }
|
1 2 3 4 5 6 7 8 9 10 11 12
| @Configuration public class WebMvcConfigurerImpl implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:9528") .allowedMethods("*") .allowedHeaders("*") .maxAge(10L); } }
|
Spring Actuator 项目可使用 application.properties 来配置
Spring Boot enabling CORS by application.properties
1 2 3 4
| endpoints.cors.allowed-origins=http://localhost:9528 endpoints.cors.allowed-methods=* endpoints.cors.allowed-headers=* endpoints.cors.max-age=10
|
Spring Security 项目中配置 CORS
CORS | Spring Security
Spring security CORS Filter | Stack Overflow
Spring Security 环境下 CORS 跨域失效问题
Spring Security配置cors跨域访问
CORS with Spring Boot and Spring Security
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override protected void configure(HttpSecurity http) throws Exception { http.cors(); }
@Bean CorsConfigurationSource corsConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); configuration.setAllowedOrigins(Arrays.asList("http://localhost:9528")); configuration.setAllowedMethods(Arrays.asList("*")); configuration.setAllowedHeaders(Arrays.asList("*")); configuration.setMaxAge(10L); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", configuration); return source; } }
|