文章目录

  • Cross-origin resource sharing (CORS)
  • 配置Cross-Origin的几种方法
    • 1 注解法 @CrossOrigin
    • 2 全局配置法 (Global Configuration)
    • 3 过滤器法(CorsFilter)
      • 3.1 没有使用 Spring security 的情况下
      • 3.2 Spring security 内置了对 CorsFilter 的支持

Cross-origin resource sharing (CORS)

参考文档: Spring Boot

Cross-origin resource sharing (CORS) is a W3C specification implemented by most browsers that lets you specify in a flexible way what kind of cross-domain requests are authorized., instead of using some less secure and less powerful approaches such as IFRAME or JSONP.

As of version 4.2, Spring MVC supports CORS. Using controller method CORS configuration with @CrossOrigin annotations in your Spring Boot application does not require any specific configuration. Global CORS configuration can be defined by registering a WebMvcConfigurer bean with a customized addCorsMappings(CorsRegistry) method, as shown in the following example:

@Configuration(proxyBeanMethods = false)
public class MyConfiguration {@Beanpublic WebMvcConfigurer corsConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/**");}};}
}

配置Cross-Origin的几种方法

参考文档:Spring MVC

1 注解法 @CrossOrigin

  • 可在类级别使用,方法级别可以继承(覆盖)
  • 默认值
    • Allow all origins.
    • Allow all headers.
    • All HTTP methods to which the controller method is mapped.
    • allowedCredentials is not enabled by default
    • Set max age to 1800 seconds (30 minutes).
  • 用于细粒度的控制
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {@CrossOrigin("https://domain2.com")@GetMapping("/{id}")public Account retrieve(@PathVariable Long id) {// ...}@DeleteMapping("/{id}")public void remove(@PathVariable Long id) {// ...}
}

2 全局配置法 (Global Configuration)

  • 默认值,详见 org.springframework.web.cors.CorsConfiguration#applyPermitDefaultValues()

    • Allow all origins.
    • Allow all headers.
    • GET, HEAD, and POST methods.(注意:这个和注解不一样)
    • allowedCredentials is not enabled by default
    • Set max age to 1800 seconds (30 minutes).
  • 一般放到 MVC Java configuration(WebMvcConfigurer的实现类)中
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/**").allowedOrigins("*").allowedHeaders("*").allowedMethods("GET", "HEAD", "POST").allowCredentials(false).maxAge(3600);// Add more mappings...}
}
  • 搞个单独的Configuration也是可以的
@Configuration(proxyBeanMethods = false)
public class CorsConfig {@Beanpublic WebMvcConfigurer corsConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/**").allowedOrigins("*").allowedHeaders("*").allowCredentials(false).maxAge(3600);}};}}

3 过滤器法(CorsFilter)

3.1 没有使用 Spring security 的情况下

@Configuration(proxyBeanMethods = false)
public class CorsConfig {/*** @see CorsConfiguration#applyPermitDefaultValues()* <ul>* <li>Allow all origins.</li>* <li>Allow "simple" methods {@code GET}, {@code HEAD} and {@code POST}.</li>* <li>Allow all headers.</li>* <li>Set max age to 1800 seconds (30 minutes).</li>* </ul>*/@Beanpublic FilterRegistrationBean corsFilter() {CorsConfiguration config = new CorsConfiguration();config.applyPermitDefaultValues(); // 注意这个简便用法config.setAllowedMethods(Collections.unmodifiableList(Arrays.asList("*")));UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));bean.setOrder(Ordered.HIGHEST_PRECEDENCE);return bean;}

3.2 Spring security 内置了对 CorsFilter 的支持

Spring Security

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http// by default uses a Bean by the name of corsConfigurationSource.cors(withDefaults())//...}@BeanCorsConfigurationSource corsConfigurationSource() {CorsConfiguration config = new CorsConfiguration();config.applyPermitDefaultValues();config.setAllowedMethods(Collections.unmodifiableList(Arrays.asList("*")));UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return source;}
}

注意一点,不要重复指定:If you are using Spring MVC’s CORS support, you can omit specifying the CorsConfigurationSource and Spring Security will leverage the CORS configuration provided to Spring MVC.

配置Cross-Origin的几种方法相关推荐

  1. 配置 yum 源的两种方法

    配置 yum 源的两种方法 由于 redhat的yum在线更新是收费的,如果没有注册的话不能使用,如果要使用,需将redhat的yum卸载后,重启安装,再配置其他源,以下为详细过程: 1.删除redh ...

  2. linux配置yum源的三种方法:

    linux配置yum源的三种方法: 1.配置网络yum源 2.通过上传镜像文件配置本地yum源 3.通过连接存储或本地镜像文件配置本地yum源(虚拟机) 配置各种yum源的时候,需要提前知道自己的li ...

  3. Linux配置网络信息(四种方法)

    Linux配置网络信息(四种方法) 临时配置IP地址(2种方式) 1.ifconfig命令 语法: ifconfig <以太网接口> <IP地址> netmask <掩码 ...

  4. CentOS7下配置Supervisor自启动的两种方法

    很多网友留言问如何配置Supervisor 自启动,现将如何在CentOS7下配置Supervisor自启动的两种方法整理如下: 一.方法一 直接将启动命令加入到/etc/rc.d/rc.local中 ...

  5. 显示屏连接DL580服务器方法,DL380, DL580, DL360 服务器系列配置Raid 5的两种方法.doc...

    ISSUE: 本文介绍DL380, DL580, DL360 服务器系列配置Raid 5的两种方法: 使用ORCA配置和使用Smart Start7.91中的Array Configuration U ...

  6. RHEL7.0 配置网络IP的三种方法

    导读 RHEL7里面的网卡命名方式从eth0,1,2的方式变成了enoXXXXX的格式. en代表的是enthernet (以太网),o 代表的是onboard (内置),那一串数字是主板的某种索引编 ...

  7. n76e003引脚图_N76E003 复位引脚(P20)配置为输入的两种方法

    由于N76E003管脚比较少,17个标准通用管脚,另外还有一个只能做输入的引脚(RESET),在项目中就可能需要用到RESET引脚作为输入,那么问题来了,怎么配置RESET引脚当作输入呢?这里介绍两种 ...

  8. AD子域的部署并配置DNS委派的几种方法

    AD子域的部署并配置DNS委派(2009-06-05 22:00:01) 分类:活动目录 1,前提环境描述: 主AD在生产环境中,中途不可以停掉,自公司希望创建独立管理的域和DNS. 这就需要创建子域 ...

  9. 如何用控制面板打开计算机配置,如何查看电脑的配置?学会下面几种方法,你就可以自己看电脑配置...

    现在的社会干什么都离不开电脑,想要用电脑很好的完成工作,首先要了解电脑的配置.电脑的配置高低直接决定了电脑的性能,那么如何查看自己电脑的配置呢?下面请看方法. 方法一:单击电脑桌面上的我的电脑或者计算 ...

  10. Python配置镜像源的三种方法

    1.常用镜像源 先分享一些比较好的镜像源: 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi ...

最新文章

  1. linux驱动:TI+DM8127+GPIO(一)之应用——报警输入输出
  2. Redis学习-内存优化
  3. IDEA创建多个模块MavenSpringBoot项目
  4. ui设计卡片阴影_UI设计形状和对象基础知识:阴影和模糊
  5. C学习杂记(二)笔试题:不使用任何中间变量如何将a、b的值进行交换
  6. Mr. Kitayuta‘s Technology CodeForces - 505D(并查集+拓扑排序或dfs找环) 题解
  7. easyexcel 在 设置标题_阿里开源(EasyExcel)
  8. MySQL存储引擎:MyISAM InnoDB
  9. CAN笔记(19) 网络管理
  10. linux下./xx做了什么?
  11. (25):Silverlight 2 综合实例之Live Search
  12. grid studio python_Grid studio表格应用程序:Python的集大成者
  13. 知乎高赞:985计算机视觉毕业后找不到工作怎么办?怒刷leetcode,还是另寻他路?...
  14. Android NDK 入门与实践
  15. 百度智能云-文字识别SDK-识别验证码Demo
  16. KVASER 与 Matlab联合使用
  17. 使用python批量压缩图片文件
  18. 邮件签名html qq,QQ邮箱:域名邮箱/个性化签名
  19. 不要虚掷你的黄金时代,不要去倾听枯燥乏味的东西,不要设法挽留无望的失败,不要把你的生命献给无知、平庸和低俗。
  20. 关于狄利克雷分布的理解

热门文章

  1. html如何冻结字段,利用jQuery实现HTML 表格行列冻结
  2. 996工作制该取消吗?
  3. php怎么控制段落排版,使用p上下分段落的排版,上下段落间距如何设置
  4. 高富帅seajs使用示例及spm合并压缩工具露脸
  5. java8 stream collectors.joining
  6. spring boot 快速入门
  7. 灰狼(GWO)算法(附完整Matlab代码,可直接复制)
  8. m对比PSO,WPA,GWPA以及GWO四种优化算法的优化性能,优化目标函数为10个来自CEC2017的标准测试函数
  9. matlab不能打开wps表格,wps无法调用excel表格数据源-wps打不开excel表格文件怎么办...
  10. 怎么提高计算机用户权限,在USER用户下提升自已的权限