CORS:

通常情况下浏览器禁止AJAX从外部获取资源,因此就衍生了CORS这一标准体系,来实现跨域请求。

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源(协议 + 域名 + 端口)服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制.

跨域请求在java spring MVC中的实现:

Spring MVC HandlerMapping 接口对CORS提供了一个内部支持,在成功的映射到一个处理器的请求之后,HanderMapping接口检查CORS的请求配置文件,然后采取下一步行动,预检(Preflight)请求能够被直接的处理,而简单和直接的CORS请求将会被拦截和经过验证,同时还需要CORS请求头的进一步设置。因此,为了确保能够实现跨域请求,在请求头中会加入Origin这一字段,来实现跨域请求,同时对于不同的主机而言请求头是不一样的。你必须有一些明确的声明的配置文件,如果相应的CORS的配置文件没有找到的话,预检请求将会被拒绝,同时请求头也不会加到相应的响应当中。每一个HandlerMapping能够被独立的配置带着基于CorsConfiguration映射的url模式。通常情况下应用使用MVC Java的配置文件或者XML命名空间来声明这样的映射。通常情况下能够使每一个单一的map映射通过所有的HandlerMapping实例。

@CrossOrigin:

这个注解能够使跨域请求实现在注解控制器里面:主要的实现方法如下:

@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }
@DeleteMapping("/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

默认情况下上述注解还实现了以下功能:

1 :所有的origin请求字段。

2:所有的请求头。

3: 所有的被映射的HTTP方法。

同时@Crossorigin继承所有的类和方法,相关的示例如下:

@CrossOrigin(origins = "https://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

@GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

@DeleteMapping("/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

全局配置:

默认情况下,全局配置需要能够满足以下几点:

1 :所有的:Ogrigin字段

2:所有的请求头。

3 :GET HEAD 和POST 方法。

为了能够使CORS(跨域请求)在MVC 的Java 的配置文件里面配置,你需要使用CorsRegistry回调接口,具体的实现例子如下:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

@Override
    public void addCorsMappings(CorsRegistry registry) {

registry.addMapping("/api/**")
            .allowedOrigins("https://domain2.com")
            .allowedMethods("PUT", "DELETE")
            .allowedHeaders("header1", "header2", "header3")
            .exposedHeaders("header1", "header2")
            .allowCredentials(true).maxAge(3600);

// Add more mappings...
    }
}

XML配置:

为了能够使CORS(跨域请求)实现在XML的命名空间需要使用<mvc:cors>组件元素,具体的实现例子如下:

<mvc:cors>

<mvc:mapping path="/api/**"
        allowed-origins="https://domain1.com, https://domain2.com"
        allowed-methods="GET, PUT"
        allowed-headers="header1, header2, header3"
        exposed-headers="header1, header2" allow-credentials="true"
        max-age="123" />

<mvc:mapping path="/resources/**"
        allowed-origins="https://domain1.com" />

</mvc:cors>

CORS Fliter:

你可以使跨域请求内置在CorsFliter类当中(即跨域过滤器)。实现配置这个过滤器,CorsConfigurationSource及其构造函数。相关的示例如下:

CorsConfiguration config = new CorsConfiguration();

// Possibly...
// config.applyPermitDefaultValues()

config.setAllowCredentials(true);
config.addAllowedOrigin("https://domain1.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*");

UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);

CorsFilter filter = new CorsFilter(source);

默认情况下上述注解还实现了以下功能:

1 :所有的origin请求字段。

2:所有的请求头。

3: 所有的被映射的HTTP方法。

同时@Crossorigin继承所有的类和方法,相关的示例如下:

@CrossOrigin(origins = "https://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {@GetMapping("/{id}")public Account retrieve(@PathVariable Long id) {// ...
    }@DeleteMapping("/{id}")public void remove(@PathVariable Long id) {// ...
    }
}

全局配置:

默认情况下,全局配置需要能够满足以下几点:

1 :所有的:Ogrigin字段

2:所有的请求头。

3 :GET HEAD 和POST 方法。

为了能够使CORS(跨域请求)在MVC 的Java 的配置文件里面配置,你需要使用CorsRegistry回调接口,具体的实现例子如下:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/**").allowedOrigins("https://domain2.com").allowedMethods("PUT", "DELETE").allowedHeaders("header1", "header2", "header3").exposedHeaders("header1", "header2").allowCredentials(true).maxAge(3600);// Add more mappings...
    }
}

XML配置:

为了能够使CORS(跨域请求)实现在XML的命名空间需要使用<mvc:cors>组件元素,具体的实现例子如下:

<mvc:cors><mvc:mapping path="/api/**"allowed-origins="https://domain1.com, https://domain2.com"allowed-methods="GET, PUT"allowed-headers="header1, header2, header3"exposed-headers="header1, header2" allow-credentials="true"max-age="123" /><mvc:mapping path="/resources/**"allowed-origins="https://domain1.com" /></mvc:cors>

CORS Fliter:

你可以使跨域请求内置在CorsFliter类当中(即跨域过滤器)。实现配置这个过滤器,CorsConfigurationSource及其构造函数。相关的示例如下:

CorsConfiguration config = new CorsConfiguration();// Possibly...
// config.applyPermitDefaultValues()

config.setAllowCredentials(true);
config.addAllowedOrigin("https://domain1.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);CorsFilter filter = new CorsFilter(source);

转载于:https://www.cnblogs.com/u-n-owen/p/10715659.html

CORS在Spring中的实现相关推荐

  1. Spring中的设计模式之Handler模式(一)

    Handler模式 命名空间解析中的NamespaceHandler(静态的Handler处理方式) NamespaceHandlerSupport(Abstract) ContextNamespac ...

  2. Spring中配置DataSource数据源的几种选择

    Spring中配置DataSource数据源的几种选择 在Spring框架中有如下3种获得DataSource对象的方法: 从JNDI获得DataSource. 从第三方的连接池获得DataSourc ...

  3. 详解设计模式在Spring中的应用

    设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. 今天,螃蟹在IT学习者网站就设计模式的内在价值做一番探讨,并以spring为例进行讲解,只有领略了 ...

  4. Spring中利用applicationContext.xml文件实例化对象和调用方法

    Spring中实例化对象和调用方法入门 1.jar包和xml的准备 已上传至百度云盘,链接: https://pan.baidu.com/s/1CY0xQq3GLK06iX7tVLnp3Q 提取码: ...

  5. 【spring 5】AOP:spring中对于AOP的的实现

    在前两篇博客中,介绍了AOP实现的基础:静态代理和动态代理,这篇博客介绍spring中AOP的实现. 一.采用Annotation方式 首先引入jar包:aspectjrt.jar && ...

  6. Spring中WebApplicationContext

    ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用"容器"来表述它更容易理解一 些,ApplicationContext则是& ...

  7. Spring中使用Schedule调度

    在spring中两种办法使用调度,以下使用是在spring4.0中. 一.基于application配置文件,配置入下: 1 <bean id="jobDetail" cla ...

  8. Spring中SmartLifecycle和Lifecycle的作用和区别

    欢迎关注方志朋的博客,回复"666"获面试宝典 本文基于SpringBoot 2.5.0-M2讲解Spring中Lifecycle和SmartLifecycle的作用和区别,以及如 ...

  9. 惊呆了,Spring中竟然有12种定义bean的方法

    前言 在庞大的 Java 技术体系中,Spring 有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜. 我们都知道 Spring 是创建和管理bean的工厂,它提供了多种方式定义 bean,能 ...

最新文章

  1. gzip压缩後的javascript在ie下不加载
  2. python装饰器类-python_类装饰器
  3. Service的理解和使用
  4. java 异常练习题_java入门异常处理练习题问题
  5. Linux系统安装MySQL5.7,授权远程登陆
  6. 【接口测试】axios测试接口
  7. PDF to Word Document Converter for Mac(PDF格式转换必备)
  8. uva10668二分解方程
  9. Elasticsearch 集成 SpringBoot并进行CRUD操作
  10. OpenCV中的图片截取和颜色通道提取
  11. python化学模拟_rdkit 化学反应高级功能
  12. android铃声代码,Android之来电铃声设置(示例代码)
  13. 云服务器多开账号,怎么用云服务器多开模拟器
  14. CMCT-FA修饰阿霉素纳米脂质体/ADR-HAS-MS单抗Hab18偶联阿霉素人血清白蛋白微球的制备方法
  15. 介于上海与江苏的地铁小户型
  16. hive以半小时为维度进行统计的需求
  17. 配置AD域环境、OU、GPO
  18. 冲刺!这篇 1658 页的《Java 面试突击核心讲》学明白保底年薪 30w
  19. java项目 基于springboot家具定制网站idea
  20. 服务器环境配置项目论文,服务器配置与管理论文范文:服务器配置论文

热门文章

  1. 数据结构之跳表Skiplist
  2. 谷歌邮箱上不了的情况下怎么登录谷歌邮箱
  3. 【SICP练习】84 练习2.56
  4. MS_SQL_获取字符串最后出现的字符串及位置
  5. SAP事务码f-02做账界面显示“页数”字段
  6. php监听订单状态,ecshop数据库订单状态判断
  7. java类为什么要建两个class_ClassLoader的几个概念、类和对象的解释
  8. 分布式系统中节点之间的同步形成区块链
  9. javascript网络_没有JavaScript的网络外观
  10. 成本管理系统开源_开源教科书如何降低大学成本