前置
同源策略是什么?
同源策略是一种约定,它是浏览器最核心也最基本的安全功能
如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。
可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
它是一个安全策略。所有支持JavaScript的浏览器都会使用这个策略
满足同源的三个条件:
所谓同源是指,域名、协议、端口相同。
为什么要同源限制?
同源策略存在的意义:
非同源下的 cookie 等隐私数据可以被随意获取。
非同源下的 DOM 可以的随意操作。
ajax 可以任意请求的话,用户的各种隐私肯定会泄露,对用户造成不同程度的损失。
同源策略的限制范围?
不能获取不同源的 cookie,LocalStorage 和 indexDB。
不能获取不同源的 DOM() 。
不能发送不同源的 ajax 请求 (可以向不同源的服务器发起请求,但是返回的数据会被浏览器拦截)。
为什么会出现跨域
出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)
什么是跨域
当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域
跨域不要重复配置
如果在网关配置了后续就不要配置了,比如在nginx或gateway配置了,后面的spring boot就不要配置了。
SpringBoot解决跨域的三种方式
方法1:添加@CrossOrigin注解
在Controller层对应的方法上添加@Controller
1 2 3 4 5 6 7 8 9 10
| @RestController @RequestMapping("index") public class IndexController {
@GetMapping("/test") @CrossOrigin public String index() { return "hello world"; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Configuration public class CorsConfiguration implements WebMvcConfigurer {
@Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("*") .allowedHeaders("*") .allowCredentials(true) .maxAge(3600); } }
|
根据spring boot 版本 调用 allowedOrigins 还是allowedOriginPatterns
方法3:添加CORS过滤器
新建配置类CorsConfig,创建CorsFilter过滤器,允许跨域
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } }
|
有前置的filter,要把跨域的filter设置为最小
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| @Configuration public class CorsConfig { private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); return corsConfiguration; }
@Bean public FilterRegistrationBean<CorsFilter> corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", buildConfig()); FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source)); bean.setOrder(Ordered.HIGHEST_PRECEDENCE); return bean; }
}
|