二. 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 端口的请求可以访问
重启服务,再次请求,就可以获取到了
@PostMapping("/addUser") @ResponseBody @CrossOrigin(origins = "*") public User addUser(@RequestBody User user){ //补充信息 user.setName("岳泽霖"); user.setDescription("POST提交 跨域问题"); return user; }
origins="*" ,表示所有的协议,所有的主机 ,所有的端口 均可以访问.
重启服务器,再次进行请求
是可以的。
这是针对每一个方法的。 如果一个类里面,方法过多,显然这种方式是不合理的.
二.一.二 单类
在类上添加该注解
@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; } }
同样是可以的.
二.三 添加 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); } }
同样是可以的
但是,通过这种方式配置的话, 自定义的拦截器会不生效。
一般采用的,都是第二种方式 CorsConfig