前言
跨域是什么?浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口和协议,只要有一个不同就是跨域 。我们的项目通常是采用前后端分离开发的,也就是前后端分离部署的,所以必然会存在跨域问题。
CORS(Cross-Origin Resource Sharing, 跨源资源共享)是W3C出的一个标准,其思想是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功,还是应该失败。Spring框架提供给我们多种方式解决跨域问题,下面列举比较常用的通过实现CORS解决跨域的两种解决方案:
@CrossOrigin注解
通过在Controller类上添加注解 @CrossOrigin,表示Controller上的所以方法允许跨域,在Controller的方法上添加注解 @CrossOrigin,表示该方法允许跨域。以下是对CrossOrigin注解类的说明:
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CrossOrigin {
String[] DEFAULT_ORIGINS = { "*" };
String[] DEFAULT_ALLOWED_HEADERS = { "*" };
boolean DEFAULT_ALLOW_CREDENTIALS = true;
long DEFAULT_MAX_AGE = 1800;
/**
* 同origins属性一样
*/
@AliasFor("origins")
String[] value() default {};
/**
* 所有支持域的集合。
* "*"代表所有域的请求都支持
* 默认所有请求的域都支持
*/
@AliasFor("value")
String[] origins() default {};
/**
* 允许请求头中跨域的header,默认不设置的话都支持
*/
String[] allowedHeaders() default {};
/**
* 允许响应头跨域的header,默认为空
*/
String[] exposedHeaders() default {};
/**
* 跨域请求支持的方法,例如"{RequestMethod.GET, RequestMethod.POST}"}。
* 默认支持RequestMapping中设置的方法
*/
RequestMethod[] methods() default {};
/**
* 是否允许cookie随请求发送,使用时必须指定具体的域
*/
String allowCredentials() default "";
/**
* 预请求的结果的有效期,默认是30分钟
*/
long maxAge() default -1;
}
配置全局CorsFilter
通过配置全局的CorsFilter,统一处理跨域问题。
@Configuration
public class GlobalCorsConfig {
@Bean
public CorsFilter corsFilter() {
//1.添加CORS配置信息
CorsConfiguration config = new CorsConfiguration();
//1) 允许的域,不要写*,否则cookie就无法使用了
config.addAllowedOrigin("域名1");
config.addAllowedOrigin("域名2");
//2) 是否发送Cookie信息
config.setAllowCredentials(true);
//3) 允许的请求方式
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
// 4)允许的头信息
config.addAllowedHeader("*");
// 5) 有效时长
config.setMaxAge(3600L);
//2.添加映射路径,我们拦截一切请求
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
//3.返回新的CorsFilter.
return new CorsFilter(configSource);
}
}
结束语
大家还有什么好的跨域解决方案,欢迎在评论区提出!
往期推荐
Web应用常见漏洞总结
如何在技术总监不懂JAVA,技术部门没有JAVA的环境下生存
高手才能看懂的JAVA排序算法图解
谈谈我在项目中是如何解决分布式事务的
手把手教你搭建一个功能完善的SpringCloud微服务架构项目三
举报/反馈

牛留分享

566获赞 493粉丝
分享学习、工作和生活。
关注
0
0
收藏
分享