SpringBoot通过Cors解决跨域问题(三十一)下

二. Cors 解决跨域文案

针对的都是服务提供者端, SpringBoot_Cors_Provider 项目里面进行操作.

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CrossOrigin {
    @Deprecated
    String[] DEFAULT_ORIGINS = {"*"};
    @Deprecated
    String[] DEFAULT_ALLOWED_HEADERS = {"*"};
    @Deprecated
    boolean DEFAULT_ALLOW_CREDENTIALS = false;
    @Deprecated
    long DEFAULT_MAX_AGE = 1800;
    @AliasFor("origins")
    String[] value() default {};
    @AliasFor("value")
    String[] origins() default {};
    String[] allowedHeaders() default {};
    String[] exposedHeaders() default {};
    RequestMethod[] methods() default {};
    String allowCredentials() default "";
    long maxAge() default -1;
}


可以在类上,也可以在方法上.


通常使用 origins 属性 和 maxAge 属性, 为-1 表示永不过期.


二.一 单方法 单类处理

二.一.一 单方法

添加 @CrossOrigin 注解, 用 origins 属性来指定

//端口号后面不能跟  /
    @CrossOrigin(origins = "http://localhost:8082")
    @GetMapping("/findById")
    @ResponseBody
    public User findById(Integer id){
        User user=new User();
        user.setId(id);
        user.setName("两个蝴蝶飞");
        user.setDescription("Get 提交 跨域问题");
        return user;
    }


只能是 http 协议, localhost 主机, 8082 端口的请求可以访问


重启服务,再次请求,就可以获取到了

SpringBoot通过Cors解决跨域问题(三十一)下


@PostMapping("/addUser")
    @ResponseBody
    @CrossOrigin(origins = "*")
    public User addUser(@RequestBody  User user){
        //补充信息
        user.setName("岳泽霖");
        user.setDescription("POST提交 跨域问题");
        return user;
    }


origins="*" ,表示所有的协议,所有的主机 ,所有的端口 均可以访问.


重启服务器,再次进行请求

SpringBoot通过Cors解决跨域问题(三十一)下



是可以的。


这是针对每一个方法的。 如果一个类里面,方法过多,显然这种方式是不合理的.


二.一.二 单类

在类上添加该注解

@Controller
@CrossOrigin(origins = "*")
public class InfoController {
   
}


则这个类下面的所有的方法,都可以 进行跨域访问。


当类过多时,这种方式也不太友好。


二.二 CorsConfig 配置全局性跨域

在 config 目录下,创建 CorsConfig 配置类

@Configuration
public class CorsConfig {
    @Bean
    public FilterRegistrationBean corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        //设置你要允许的网站域名,如果全允许则设为 *
        config.addAllowedOrigin("*");
        //config.addAllowedOrigin("http://localhost:8082");
        //设置要限制的Header和Method
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        //bean注册顺序
        bean.setOrder(0);
        return bean;
    }
}


同样是可以的.


SpringBoot通过Cors解决跨域问题(三十一)下


二.三 添加 Cors映射

在 WebConfig 目录下, 添加相应的 cors 映射 配置

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    /**
     * 配置静态的资源信息
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        //映射 static 目录
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        //放置其他 业务页面资源
        registry.addResourceHandler("/**").addResourceLocations("classpath:/templates/");
    }
    /**
     进行添加配置
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                //是否发送Cookie
                .allowCredentials(true)
                //放行哪些原始域
                .allowedOrigins("*")
                .allowedMethods("*")
                .allowedHeaders("*")
                .allowCredentials(true);
    }
}


同样是可以的

SpringBoot通过Cors解决跨域问题(三十一)下

但是,通过这种方式配置的话, 自定义的拦截器会不生效。


一般采用的,都是第二种方式 CorsConfig


上一篇:SpringBoot导入和导出Csv文件(二十八)下


下一篇:求一个数组内的所有数字的和