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

CORS在Spring中的实现的更多相关文章

  1. Spring中文文档

    前一段时间翻译了Jetty的一部分文档,感觉对阅读英文没有大的提高(*^-^*),毕竟Jetty的受众面还是比较小的,而且翻译过程中发现Jetty的文档写的不是很好,所以呢翻译的兴趣慢慢就不大了,只能 ...

  2. Velocity初探小结--Velocity在spring中的配置和使用

    最近正在做的项目前端使用了Velocity进行View层的数据渲染,之前没有接触过,草草过了一遍,就上手开始写,现在又回头细致的看了一遍,做个笔记. velocity是一种基于java的模板引擎技术, ...

  3. Spring中Bean的作用域、生命周期

                                   Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...

  4. Spring中Bean的实例化

                                    Spring中Bean的实例化 在介绍Bean的三种实例化的方式之前,我们首先需要介绍一下什么是Bean,以及Bean的配置方式. 如果 ...

  5. 模拟实现Spring中的注解装配

    本文原创,地址为http://www.cnblogs.com/fengzheng/p/5037359.html 在Spring中,XML文件中的bean配置是实现Spring IOC的核心配置文件,在 ...

  6. Spring中常见的bean创建异常

    Spring中常见的bean创建异常 1. 概述     本次我们将讨论在spring中BeanFactory创建bean实例时经常遇到的异常 org.springframework.beans.fa ...

  7. Spring中配置数据源的4种形式

    不管采用何种持久化技术,都需要定义数据源.Spring中提供了4种不同形式的数据源配置方式: spring自带的数据源(DriverManagerDataSource),DBCP数据源,C3P0数据源 ...

  8. spring中InitializingBean接口使用理解

    InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法. 测试程序如下: imp ...

  9. Quartz 在 Spring 中如何动态配置时间--转

    原文地址:http://www.iteye.com/topic/399980 在项目中有一个需求,需要灵活配置调度任务时间,并能自由启动或停止调度. 有关调度的实现我就第一就想到了Quartz这个开源 ...

随机推荐

  1. PHP yii框架FormWidget组件

    本篇文章介绍的是PHP yii框架Form组件,方便在view层更好调用此功能,话不多说上代码:1.先继承yii本身Widget类 <?php/** * User: lsh */ namespa ...

  2. 【Maven Jenkins】No resource to compile 还有多少坑要踩。。。LongTimeNoSee

    [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ toptown-webservice-vcrs ---[INFO] N ...

  3. 《高性能Mysql》解读---Mysql的事务和多版本并发

    1.base:ACID属性,并发控制 2.MySql事务的隔离级别有哪些,含义是什么? 3.锁知多少,读锁,写锁,排他锁,共享锁,间隙锁,乐观锁,悲观锁. 4.Mysql的事务与锁有什么关联?MySq ...

  4. jupyter notebook + frp 实现内容穿透

    服务器上找到frps.ini 配置如下 [common] bind_port = 7000 vhost_http_port = 8890 要穿透的笔记本的frpc.ini配置 [common] ser ...

  5. ARMLCD屏调试2--ili9325驱动编写

    2011-06-24 21:57:09 一,读id--完成 二,自己写了驱动--完成 三,调试LCD屏驱动--完成 一         读id,不过过程还有点曲折. 因为之前写命令写数据的时序是根据i ...

  6. RESTClient 使用

    Wisdom RESTClient 一款自动化测试REST API的工具,它可以自动化测试RESTful API并生成精美的测试报告,同时基于测试过的历史API,可以生成精美的RESTful API文 ...

  7. 前后端通信中使用Ajax与后台接口api交互(以登录功能为例)

    一.查阅开发文档 首先,要做这个功能前,我们必须先查阅后台接口文档,了解使用登录接口时,需要提交哪些参数,并且接口使用返回的数据. 这里我使用了一个返回json格式数据的登录接口为例,讲解怎么使用Aj ...

  8. Kafka启动报错 : ERROR Processor got uncaught exception

    参照我之前的一篇博文Kafka学习之(二)Centos下安装Kafka安装了kafka并启动,状况并不像我之前最初的预期,报错了,并且我在当前Linux环境下安装的Java版本.Kafka版本都是和之 ...

  9. Bugku-CTF之welcome to bugkuctf(php://filter和php://input的妙用)

    Day24 welcome to bugkuctf http://123.206.87.240:8006/test1/ 本题要点:代码审计,PHP://filter ,  php://input ,  ...

  10. python from entry to abandon4

    python from entry to abandon系列的收官之作    本篇博客将会介绍<简明Python教程>的最后四章内容.并在最后附上对于本书的个人评价和下阶段自学Python ...