Skip to content

跨域问题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");
            }
        };
    }
}