Spring的跨域解决方案总结

前言

跨域是什么?浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口和协议,只要有一个不同就是跨域 。我们的项目通常是采用前后端分离开发的,也就是前后端分离部署的,所以必然会存在跨域问题。

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);

}

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值