原文地址:http://docs.spring.io/spring/docs/5.0.0.RC2/spring-framework-reference/web.html#mvc-introduction

一、简介

出于安全原因,浏览器禁止Ajax调用与当前资源不同源的外部资源。例如:如果你正在一个窗口检查你的银行账户,那你可能会遇到这样的错误:com网站在另一个窗口打开。这是一个错误的脚本。因为com不应该让Ajax使用你的凭证请求到你的银行API(例如:从你的银行账户提现)。

Cross-origin resource sharing(CORS) 是一个大多数浏览器对W3C规范的实现,它允许你灵活的对具体的跨域请求进行授权,而不是使用一些不太安全或者不太稳固的手段,例如:IFRAME 和 JSONP。

从Spring Framework4.2以来,CORS支持开箱即用。CORS请求(包括一个带有OPTIONS预检的方法)被动态的分发到各种已经注册的HandlerMappings。他们处理CORS的预检请求,拦截简单的和精确的CORS请求。这一切都归功于CorsProcessor实现(默认为DefaultCorsProcessor)了根据您提供的CORS配置去添加相关的CORS响应头(如Access-Control-Allow-Origin)。

备注:由于CORS请求被动态分发,所以,你不必去改变DispatcherServlet、dispatchOptionsRequest的初始化参数。推荐使用默认的参数值(false)。

二、在Controller方法中配置CORS

你可以添加一个@CrossORigin注解到你的@RequestMapping注解上,去为一个方法添加CORS授权。通过默认的@CorssOrigin注解,它允许所有的同源和基于HTTP协议的调用:

@RestController
@RequestMapping("/account")
public class AccountController { @CrossOrigin
@RequestMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
} @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}

它也可以为整个Controller开启CORS授权:

@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController { @RequestMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
} @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}

在上面的CORS授权实例中,都是通过操作retrieve()和remove()方法。你还可以通过使用@CrossOrigin属性去定制CORS。

你甚至可以同时使用基于Controller和基于method方法的CORS配置。Spring将合成它们各自的属性去创建一个完整的CORS配置:

@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController { @CrossOrigin("http://domain2.com")
@RequestMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
} @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}

三、全局的CORS配置

除了基于注解的细粒度的配置,你可能还需要定义一些全局的CORS配置。这有点类似于filter,可以使用SpringMVC的声明去做,并且组合细粒度的@CrossORigin配置。默认同源,和GET、HEAD、POST方法被允许CORS调用

1,JavaConfig

简单为整个application应用CORS:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer { @Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}

你也可以很容易的修改任何属性,以及将此CORS配置到任意路径的模式:

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

2,XML 命名空间

下面极简单的XML配置将为所有的/**路径请求模式开启CORS授权(同样默认的属性配置,同上面提到的JavaConfig实例):

<mvc:cors>
<mvc:mapping path="/**" />
</mvc:cors>

也可以通过定制属性去声明几个CORS授权配置:

<mvc:cors>

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

四、高级定制

CorsConfiguration允许你指定CORS请求被处理的方式:允许同源、headers、methods等。它可以由几种不同的方式配置:

1,AbstractHandlerMapping#setCorsConfiguration()允许指定映射路径模式(如/ api / **)的几个CorsConfiguration实例的Map。

2,子类可以通过覆盖AbstractHandlerMapping#getCorsConfiguration(Object,HttpServletRequest)方法来提供自己的CorsConfiguration。

3,处理程序可以实现CorsConfigurationSource接口(像ResourceHttpRequestHandler现在这样做),以便为每个请求提供一个CorsConfiguration实例

五、基于Filter的CORS支持

为了支持基于过滤器安全框架(如Spring Security)的CORS,或者与其他不支持本地CORS的库一起支持CORS,Spring Framework还提供了一个CorsFilter。代替使用@CrossOrigin或WebMvcConfigurer#addCorsMappings(CorsRegistry),您需要注册一个自定义过滤器,定义如下:

import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter; public class MyCorsFilter extends CorsFilter { public MyCorsFilter() {
super(configurationSource());
} private static UrlBasedCorsConfigurationSource configurationSource() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("http://domain1.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return source;
}
}

你需要确保CorsFilter在其他filter之前执行。

SpringMVC对于跨域访问的支持的更多相关文章

  1. jquery + node 通过 CORS 实现跨域访问,支持cookie和自定义header

    跨域有多种方式,现在的情况看来还是CORS更适合一些,有很多优点,比如浏览器正式支持.支持post.可以控制跨域访问的网站等. 我们来看看node如何实现cors方式的跨域.在网上找到了一些代码,考过 ...

  2. nginx实现跨域访问并支持(GET, POST,PUT,DELETE, OPTIONS)

    最近有同事提出在使用客户端跨域访问的时候,发现服务器对option请求返回了403,后来查看了网络添加了一段配置,发现option服务返回204了,但是后续的put操作也直接返回了204导致无法使用图 ...

  3. SpringMVC 允许跨域访问 也可以选择限制指定IP 允许访问 对象的数据传输

    java ajax

  4. Spring Boot 2中对于CORS跨域访问的快速支持

    原文:https://www.jianshu.com/p/840b4f83c3b5 目前的程序开发,大部分都采用前后台分离.这样一来,就都会碰到跨域资源共享CORS的问题.Spring Boot 2 ...

  5. Angular2中对ASP.NET MVC跨域访问

    应用场景 项目开发决定使用angular2进行前后端分离开发,由我负责后端服务的开发,起初选择的是web api进行开发.对跨域访问通过API中间件+过滤器对跨域访问进行支持.开发一段后,通知需要移植 ...

  6. 【转】silverlight 跨域访问

    作者:MIDI  来源:博客园  发布时间:2010-01-01 17:39  阅读:204 次  原文链接   [收藏]    在 Silverlight 使用 WebService .WCF.We ...

  7. 详解SpringBoot应用跨域访问解决方案

    一.什么是跨域访问 说到跨域访问,必须先解释一个名词:同源策略.所谓同源策略就是在浏览器端出于安全考量,向服务端发起请求必须满足:协议相同.Host(ip)相同.端口相同的条件,否则访问将被禁止,该访 ...

  8. SpringMvc支持跨域访问,Spring跨域访问,SpringMvc @CrossOrigin 跨域

    SpringMvc支持跨域访问,Spring跨域访问,SpringMvc @CrossOrigin 跨域 >>>>>>>>>>>> ...

  9. SpringMvc支持跨域访问,Spring跨域访问,SpringMvc @CrossOrigin 跨域[转]

    SpringMvc支持跨域访问,Spring跨域访问,SpringMvc @CrossOrigin 跨域 原文地址:https://www.cnblogs.com/fanshuyao/p/716847 ...

随机推荐

  1. jsp页面file标签上传图片以及blob类型数据库存取。

    我的jsp页面表单如下: <form name="form1" action="/YiQu/AddUserServlet?jurisdiction=1" ...

  2. Azure 镜像市场支持一键部署到云

    本视频教程介绍了Azure 镜像市场和一键部署到云. Azure 镜像市场(AMP)由世纪互联运营,是一个联机应用程序和服务市场,它通过独立软件服务商(ISV)能够成为 Azure 客户(Custom ...

  3. POJ 1185 炮兵阵地 (状压DP,轮廓线DP)

    题意: 给一个n*m的矩阵,每个格子中有'P'或者'H',分别表示平地和高原,平地可以摆放大炮,而大炮的攻击范围在4个方向都是2格(除了自身位置),攻击范围内不能有其他炮,问最多能放多少个炮?(n&l ...

  4. javaweb基础(18)_jsp属性范围

    所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...

  5. java基础——随机数问题

    /** * 要求:随机打印50个随机(4-10长度)的字符串,要求字符串包含的范围是所有的英文字母包含大小写和数字, * 按照编码顺序排序,每行打印4个,要求首字符对齐 * @author fanyu ...

  6. 使用Electron开发PC客户端

    最近公司要求开发一个PC客户端,要求不能使用.NET开发(为了不让用户安装.net framework),所以就选择了Electron(随口听别人说了一句,之前从来没有接触过).目前项目要完毕了,所以 ...

  7. 计算机应用第三次作业:自动开机自动关机 常用DOS命令 关于文件文件夹

    一.自动开机 台式机启动时按住DEL键 进入一个蓝色的界面,界面上是英文提示 这个界面是BIOS  ,是在机器的ROM中存储 二.自动关机 自动重启 方法一在120秒钟后自动关机 win+r (RUN ...

  8. Chunky Monkey-freecodecamp算法题目

    Chunky Monkey(猴子吃香蕉, 分割数组) 要求 把一个数组arr按照指定的数组大小size分割成若干个数组块. 思路 利用size值和while语句确定切割数组的次数(定义temp将siz ...

  9. c++ 用指针操作数组

    #include <iostream> using namespace std; const int Max = 5; double * fill_array(double * first ...

  10. python爬虫基础13-selenium大全7/8-异常

    Selenium笔记(7)异常 本文集链接:https://www.jianshu.com/nb/25338984 完整文档 Exceptions that may happen in all the ...