1.什么是跨域
跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。
2.什么是同源策略
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。
可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
同源策略,它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。
3.非同源的限制
- cookie不能读取
- dom无法获得
- ajax请求不能发送
4.如何解决跨域问题
4.1使用@CrossOrigin
是springMVC的版本要在4.2或以上版本才支持@CrossOrigin,将注解放在类上或者方法上
/**
* @author wangli
* @data 2022/3/23 17:13
* @Description:黑名单控制器
*/
@RestController
@RequestMapping("/blacklist")
@Api("黑名单控制器")
@CrossOrigin
public class BlackListController {
@Autowired
private BlackListService blackListService;
@Autowired(required = false)
private BlackListMapper blackListMapper;
@PostMapping("/saveBlackList")
@ApiOperation(value = "加入黑名单 wangli",notes = "加入黑名单 wangli",response = StandardResult.class)
@ApiImplicitParams({
@ApiImplicitParam(paramType = "body",name = "BlackListModel",value = "黑名单模型",required = true,dataType = "QuestionModel")
})
public StandardResult saveQuestion(@RequestBody BlackListModel blackListModel) {
try {
if (blackListModel.getUserId() == null) {
blackListModel.setUserId(UserHolder.getUserId());
}
blackListService.save(blackListModel);
return StandardResult.ok();
} catch (Exception e) {
return StandardResult.faild(e);
}
}
其中@CrossOrigin中的2个参数:
origins : 允许可访问的域列表
maxAge:准备响应前的缓存持续的最大时间(以秒为单位)。
2.基于过滤器
package com.atguigu.gateway.config; /** * <p> * 处理跨域 * </p> * * @author wangli * @since 2021-11-21 */ @Configuration public class CorsConfig { @Bean public CorsWebFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); config.addAllowedMethod("*"); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser()); source.registerCorsConfiguration("/**", config); return new CorsWebFilter(source); } }
3.使用全局配置
@Configuration
public class MyConfiguration {@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
};
}
}
您可以轻松地更改任何属性,以及仅将此CORS配置应用到特定的路径模式:
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(false).maxAge(3600);
}
3.整合gataway
@Configuration
public class ZspMallCorsConfig {
@Bean
public CorsWebFilter corsWebFilter(){
UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.setAllowCredentials(true);source.registerCorsConfiguration("/**",corsConfiguration);
return new CorsWebFilter(source);
}
}
corsConfiguration.addAllowedHeader(""); :允许所有请求头
corsConfiguration.addAllowedMethod(""); :允许所有请求方法,例如get,post等
corsConfiguration.addAllowedOrigin("*");允许所有的请求来源
corsConfiguration.setAllowCredentials(true); 允许携带cookie
source.registerCorsConfiguration("/**",corsConfiguration); 对所有经过网关的请求都生效