跨源资源共享(CORS)概念、实现(用Spring)、起源介绍
本文内容引用自:
https://howtodoinjava.com/spring5/webmvc/spring-mvc-cors-configuration/
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
基本概念
跨源资源共享(Cross-Origin Resource Sharing, CORS)是一种机制,它使用额外的HTTP头文件告诉浏览器,让在一个源(域)运行的web应用程序有权访问来自不同源服务器的选定资源。当web应用程序请求源(域、协议和端口)与自己的源不同的资源时,它将执行跨源HTTP请求。
跨源请求的示例:
来自http://domain-a.com的Web应用程序的前端JavaScript代码使用XMLHttpRequest来请求http://api.domain-b.com/data.json 。
安全策略
出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求。例如,XMLHttpRequest
与提取API遵循同源策略。这意味着使用这些API的Web应用程序只能从加载应用程序的同一源请求HTTP资源,除非来自其他来源的响应包含正确的CORS标头。
implementation in Spring
1. Spring CORS – Method level with @CrossOrigin
Spring MVC provides @CrossOrigin
annotation. This annotation marks the annotated method or type as permitting cross origin requests.
1.1. Spring CORS allow all
By default, @CrossOrigin allows all origins, all headers, the HTTP methods specified in the @RequestMapping
annotation and a maxAge
of 30 minutes.
You can override default CORS settings by giving value to annotation attributes :
ATTRIBUTE | DESCRIPTION |
---|---|
origins |
List of allowed origins. It’s value is placed in the Access-Control-Allow-Origin header of both the pre-flight response and the actual response.– * – means that all origins are allowed.– If undefined, all origins are allowed. |
allowedHeaders |
List of request headers that can be used during the actual request. Value is used in preflight’s response header Access-Control-Allow-Headers .– * – means that all headers requested by the client are allowed.– If undefined, all requested headers are allowed. |
methods |
List of supported HTTP request methods. If undefined, methods defined by RequestMapping annotation are used. |
exposedHeaders |
List of response headers that the browser will allow the client to access. Value is set in actual response header Access-Control-Expose-Headers .– If undefined, an empty exposed header list is used. |
allowCredentials |
It determine whether browser should include any cookies associated with the request. – false – cookies should not included.– "" (empty string) – means undefined.– true – pre-flight response will include the header Access-Control-Allow-Credentials with value set to true.– If undefined, credentials are allowed. |
maxAge |
maximum age (in seconds) of the cache duration for pre-flight responses. Value is set in header Access-Control-Max-Age .– If undefined, max age is set to 1800 seconds (30 minutes). |
1.2. @CrossOrigin at Class/Controller Level
@CrossOrigin (origins = "*" , allowedHeaders = "*" ) @Controller public class HomeController { @GetMapping (path= "/" ) public String homeInit(Model model) { return "home" ; } } |
Read More – Spring 5 MVC Example
1.3. @CrossOrigin at Method Level
@Controller public class HomeController { @CrossOrigin (origins = "*" , allowedHeaders = "*" ) @GetMapping (path= "/" ) public String homeInit(Model model) { return "home" ; } } |
1.4. @CrossOrigin Overridden at Method Level
homeInit()
method will be accessible only from domain http://example.com
. Rest other methods in HomeController
will be accessible from all domains.
@Controller @CrossOrigin (origins = "*" , allowedHeaders = "*" ) public class HomeController { @GetMapping (path= "/" ) public String homeInit(Model model) { return "home" ; } } |
2. Spring CORS – Global CORS configuration
2.1. Spring MVC CORS with WebMvcConfigurerAdapter
To enable CORS for the whole application, use WebMvcConfigurerAdapter
to add CorsRegistry
.
@Configuration @EnableWebMvc public class CorsConfiguration extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping( "/**" ) .allowedMethods( "GET" , "POST" ); } } |
2.2. Spring Boot CORS with WebMvcConfigurer
In spring boot application, it is recommended to just declare a WebMvcConfigurer
bean.
@Configuration public class CorsConfiguration { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping( "/**" ); } }; } } |
2.3. CORS with Spring Security
To enable CORS support through Spring security, configure CorsConfigurationSource
bean and use HttpSecurity.cors()
configuration.
@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.cors().and() //other config } @Bean CorsConfigurationSource corsConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); configuration.setAllowedMethods(Arrays.asList( "GET" , "POST" )); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration( "/**" , configuration); return source; } } |
出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求。例如,XMLHttpRequest
与提取API遵循同源策略。这意味着使用这些API的Web应用程序只能从加载应用程序的同一源请求HTTP资源,除非来自其他来源的响应包含正确的CORS标头。
跨源资源共享(CORS)概念、实现(用Spring)、起源介绍的更多相关文章
- AmazonS3 使用AWS SDK for Java实现跨源资源共享 (CORS)
CORS 配置 创建 CORS 配置并对存储桶设置该配置 通过添加规则来检索并修改配置 向存储桶添加修改过的配置 删除配置 import com.amazonaws.AmazonServiceExce ...
- CORS跨源资源共享概念及配置(Kubernetes Ingress和Spring Cloud Gateway)
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 跨源资源共享CORS 跨源资源共享 (CORS) (或通俗地译为跨域资源共享)是一种基于HTTP 头的机制,该机制通过 ...
- JS高程3:Ajax与Comet-进度事件、跨源资源共享
有以下 6 个进度事件 loadstart:在接收到响应数据的第一个字节时触发. progress:在接收响应期间持续不断地触发. error:在请求发生错误时触发. abort:在因 ...
- 彻底掌握CORS跨源资源共享
本文来自于公众号链接: 彻底掌握CORS跨源资源共享 ) 本文接上篇公众号文章:彻底理解浏览器同源策略SOP 一.概述 在云时代,各种SAAS应用层出不穷,各种互联网API接口越来越丰富,H5技术在微 ...
- SpringBoot系列——CORS(跨源资源共享)
前言 出于安全原因,浏览器禁止ajax调用当前源之外的资源(同源策略),我们之前也有写个几种跨域的简单实现(还在问跨域?本文记录js跨域的多种实现实例),本文主要详细介绍CORS,跨源资源共享,以及如 ...
- VUE SpringCloud 跨域资源共享 CORS 详解
VUE SpringCloud 跨域资源共享 CORS 详解 作者: 张艳涛 日期: 2020年7月28日 本篇文章主要参考:阮一峰的网络日志 » 首页 » 档案 --跨域资源共享 CORS 详解 ...
- 跨域资源共享(CORS)问题解决方案
CORS:Cross-Origin Resource Sharing(跨域资源共享) CORS被浏览器支持的版本情况如下:Chrome 3+.IE 8+.Firefox 3.5+.Opera 12+. ...
- 跨域资源共享CORS与JSONP
同源策略限制: 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果没有同源策略,攻击者可以通过JavaScript获取你的邮件以及其他敏感信息,比如说 ...
- JavaScript跨源资源共享
CORS(跨 源资源共享)基本思想,就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应式应该成功还是失败 IE对CORS的实现 IE8引入了XDR类型,与XHR类似,但可以实现安 ...
随机推荐
- Learning-Python【12】:装饰器
一.什么是装饰器 器:工具 装饰:为被装饰对象添加新功能 装饰器本身可以是任意可调用的对象,即函数 被装饰的对象也可以是任意可调用的对象,也是函数 目标:写一个函数来为另外一个函数添加新功能 二.为何 ...
- Learning-Python【30】:基于UDP协议通信的套接字
UDP协议没有粘包问题,但是缓冲区大小要足够装数据包大小,建议不要超过 512 服务端: # 服务端 import socket server = socket.socket(socket.AF_IN ...
- 小程序之 tab切换(选项卡)
好久没有写东西了 今天写一个简单的东西 小程序tab切换 (选项卡功能) .wxml <view class="swiper-tab"> <view < ...
- Hadoop-3.0.2 覆盖源代码生效
一.需求背景 基于业务需求,需要修改hadoop源码,将局部源代码修改后,放在自己的工程目录下,由于其相同的路径,想要覆盖掉源码对应部分 二.环境背景 IDEA下,编辑MapReduce任务,打包提交 ...
- linux安装nord,卸载nord源
需要提前准备好:能使用的sock代理. 1.在这里 https://nordvpn.com/zh/download/linux/ 下载初始安装包,这包不是真正的软件,而是会给你添加一个源,大概为了安全 ...
- CTF显隐术:九连环
题目:http://www.shiyanbar.com/ctf/2007 这个也挺基础的,需要注意的是:1.不要因为binwalk扫不出来就以为没有隐藏嵌入数据.2.千万不要暴力破解压缩包,如果是这样 ...
- Codeforces 1100 F - Ivan and Burgers
F - Ivan and Burgers 思路:线性基+贪心,保存线性基中每一位的最后一个 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #p ...
- vuejs点滴
博客0.没事的时候可以看的一些博客:https://segmentfault.com/a/1190000005832164 http://www.tuicool.com/articles/vQBbii ...
- 整合MyBatis(springboot)
pom文件: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>m ...
- [easyUI] autocomplete 简单自动完成以及ajax从服务器端完成
通过id取input标签对象,调用autocomplete方法 <script> var sources = [ "ActionScript", "Apple ...