跨域问题CORS(Cross-Origin Resource Sharing) 同源策略
为了防止被攻击,js里http请求只能请求当前同一域名下的资源
ajax会发送一个预检请求,来询问服务器是否是安全资源,这时候服务器应返回告诉前端自己是安全的,然后前端才会进行真正的请求。
spring boot框架下解决方法
1、在controller主类上加@CrossOrigin(value = "http://域名",maxAge = 1800,method = [get,put,delete,push])
,意思是该controller类允许该域名下的的所有请求的访问,也可以加在controller里的方法上,表示该方法能够支持跨域调用
同时,这个注解里还有很多东西可以设置,如过期时间、允许的请求的方法...
2、创建一个类叫WebMvcConfig 实现 WebMvcConfigurer接口,在类上加入注解@Congfiguration
并在类里重载addCorsMappings(CorsRegistry registry)方法,在方法里加入相关配置就好了,总体如下:
java
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedHeaders("*")
.allowedMethods("*")
// 或者.allowedMethods("GET", "POST", "PUT", "DELETE");
.allowedOrigins("http://域名")
.maxAge(1800);
}
}
3、注入corsfilter
java
@Configuration
public class WebMvcConfig {
@Bean
CorsFilter corsFilter(){
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration cfg = new CorsConfiguration();
cfg.addAllowedHeader("*");
cfg.addAllowedMethod("*");
cfg.addAllowedOrigin("http://域名");
cfg.setMaxAge((long) 1800);
source.registerCorsConfiguration("/接口(如:/uerid,如果要支持所有则用:/**)",cfg);
return new CorsFilter(source);
}
}
4、在Application注入WebMvcConfigurer
java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*") //允许所有的url
.allowCredentials(true) //为true时允许request带cookie
.allowedMethods("GET", "POST", "PUT", "DELETE");
}
};
}
}