什么是跨域?
跨域就是发起请求的域和被请求资源所在域不同,只要域名,端口,协议只要有一件不同那都是跨域。本地开发时前后端分离也会被视为跨域。
注意:跨域只发生在前端因为浏览器有同源策略要求。后端在请求其它域资源虽然也属于跨域但不会显示异常。
在实际开发中:什么时候会造成跨域?假设我们从网站1访问网站2的资源可能由于域名(com.baidu.com从左到右分别是一级二级三级域名),协议(网页链接前面的http啊https啊这样的),服务器端口(8080,8088这样的)不同等都会造成跨域。
那我们在springboot里如何解决它?
方法一:使用@CrossOrigin注解,这里要是将origins的值设置为通配符 * 就是允许所有跨域
@RestController
public class MyController {
@CrossOrigin(origins = "http://example.com")//允许来自该路径的请求
@GetMapping("/public-api")
public String publicApi() {
return "This is a public API";
}
}
方法二 :配置全局cors
通过实现WebMvcConfigurer接口并且重写里面的addCorsMappings方法来解决跨域
@Configuration //配置注解//标记该类为配置类
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") //这表示对所有的路径允许
.allowedOrigins("http://example.com")//指定该网站允许跨域
.allowedMethods("GET", "POST", "PUT", "DELETE")//允许请求类型
.allowedHeaders("*")//表示允许所有的请求头进行跨域访问
.allowCredentials(true)//设置允许跨域请求携带凭据(比如 Cookie 等)
.maxAge(3600);//浏览器可以缓存预检查请求(OPTIONS 请求)结果的最大时长,单位秒
}
}
方法三:使用spring security配置cors
@Configuration //指定为配置类
@EnableWebSecurity //启用了Spring的Web安全功能,触发 Spring Security 介入对Web应用安全配置
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// 其他配置...
//cors方法返回一个CorsConfigurer对象,
.cors().and() // 启用CORS
// 其他配置...
;
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("http://example.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
方法四:使用Cors Filter
@Bean
// 此方法使用@Bean注解,意味着该方法返回的对象(这里是CorsFilter)将会作为一个Bean被注册到Spring容器中,
// 这样Spring容器就能管理它的生命周期,并且其他组件在需要时可以通过依赖注入的方式获取并使用这个CorsFilter对象。
public CorsFilter corsFilter() {
// 创建一个基于URL的跨域配置源对象,它可以基于不同的URL路径来设置相应的跨域配置信息,
// 后续我们会使用它来注册针对具体路径的跨域配置规则,这里先实例化好准备进行配置操作。
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
// 创建一个CorsConfiguration对象,这个对象用于定义具体的跨域资源共享(CORS)规则,
// 例如允许哪些源访问、允许哪些请求头、允许哪些请求方法等内容都通过这个对象来进行设置。
CorsConfiguration config = new CorsConfiguration();
// 设置允许跨域请求携带凭据(比如Cookie等),这在有用户认证需求且涉及跨域的场景下非常重要,
// 只有设置为true,浏览器在跨域请求时才会把相关的认证凭据发送过去,
// 不过需要注意,如果设置了这个为true,那么在配置允许的源时就不能使用通配符(*),而要明确指定具体的源,// 这里明确指定了允许的源是 "http://example.com"。
config.setAllowCredentials(true);
// 添加允许跨域访问的源,这里只允许来自 "http://example.com" 这个域名的请求进行跨域访问,
// 如果有多个允许的源,可以多次调用此方法添加不同的源域名,例如:
// config.addAllowedOrigin("http://example.com");
// config.addAllowedOrigin("http://another.com");
config.addAllowedOrigin("http://example.com");
// 添加允许的请求头,这里使用通配符(*)表示允许所有的请求头进行跨域访问,
// 也就是说对请求头不做具体限制,任何请求头都可以在符合跨域规则的情况下随请求一起发送,
// 如果只想允许特定的请求头,可以传入具体的请求头名称,例如:
// config.addAllowedHeader("Content-Type");
// config.addAllowedHeader("Authorization");
config.addAllowedHeader("*");
// 添加允许的请求方法,这里使用通配符(*)表示允许所有的HTTP请求方法进行跨域操作,
// 像GET、POST、PUT、DELETE等任何方法的请求都可以跨域发送,
// 如果只想允许特定的几种请求方法,可以传入具体的请求方法名称,例如:
// config.addAllowedMethod("GET");
// config.addAllowedMethod("POST");
config.addAllowedMethod("*");
// 使用前面创建的基于URL的跨域配置源对象(source),将我们定义好的跨域配置(config)注册到所有路径(/** 表示通配符,涵盖所有路径)上,
// 意味着整个应用的所有请求都会应用我们在这里设置的跨域规则,进行相应的跨域处理。
source.registerCorsConfiguration("/**", config);
// 创建一个新的CorsFilter过滤器对象,传入我们配置好的基于URL的跨域配置源对象(source),
// 这个CorsFilter会在Web请求处理流程中根据注册好的跨域配置规则来拦截和处理跨域相关的逻辑,
// 确保符合我们定义的跨域规则的请求能够顺利通过并被正确处理,最后将这个过滤器对象返回,以便注册到Spring容器中供使用。
return new CorsFilter(source);
}