什么是跨域
跨域问题是由同源策略引发,同源策略浏览器重要的安全策略,浏览器限制跨源http请求;源有三部分组成,协议、主机、端口号;跨源的http请求即为跨域。
什么是CORS
英文全称 Cross-origin Resource Sharing,即 跨源资源共享(CORS,或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其他源(域、协议或端口),使得浏览器允许这些源访问加载自己的资源。
Spring MVC支持CORS
- Spring MVC 跨源资源共享的过程
Spring MVC HandlerMapping的实现类提供了内置支持CORS的功能。在成功将请求映射到处理程序之后,HandlerMapping实现会检查给定请求和处理程序的CORS配置,并采取进一步的处理;预检请求将直接处理,而简单和实际的CORS请求将被拦截、验证并设置所需的CORS响应头。
-
Spring MVC中CORS的配置方法
-
@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 = "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) { // ... } }
-
实现WebMvcConfigurer类,重写addCorsMappings方法完成全局配置
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("https://domain2.com") .allowedMethods("PUT", "DELETE") .allowedHeaders("header1", "header2", "header3") .exposedHeaders("header1", "header2") .allowCredentials(true).maxAge(3600); // Add more mappings... } }
-
配置CorsFilter对象
@Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); // 允许cookies跨域 config.setAllowCredentials(true); // #允许向该服务器提交请求的URI,*表示全部允许,自定义可以添加多个,在SpringMVC中,如果设成*,会自动转成当前请求头中的Origin config.addAllowedOrigin("*"); // #允许访问的头信息,*表示全部,可以添加多个 config.addAllowedHeader("*"); // 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了 config.setMaxAge(1800L); // 允许提交请求的方法,*表示全部允许,一般OPTIONS,GET,POST三个够了 config.addAllowedMethod("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); //对所有接口都有效 source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } }
-
-