博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring MVC 4.2 CORS 跨域访问
阅读量:5745 次
发布时间:2019-06-18

本文共 3889 字,大约阅读时间需要 12 分钟。

跨站 HTTP 请求(Cross-site HTTP request)是指发起请求的资源所在域不同于该请求所指向资源所在的域的 HTTP 请求。比如说,域名A()的某 Web 应用程序中通过标签引入了域名B()站点的某图片资源(),域名A的那 Web 应用就会导致浏览器发起一个跨站 HTTP 请求。在当今的 Web 开发中,使用跨站 HTTP 请求加载各类资源(包括CSS、图片、 脚本以及其它类资源),已经成为了一种普遍且流行的方式。

正如大家所知,出于安全考虑,浏览器会限制脚本中发起的跨站请求。比如,使用 XMLHttpRequest 对象发起 HTTP 请求就必须遵守同源策略(same-origin policy)。 具体而言,Web 应用程序能且只能使用 XMLHttpRequest 对象向其加载的源域名发起 HTTP 请求,而不能向任何其它域名发起请求。为了能开发出更强大、更丰富、更安全的Web应用程序,开发人员渴望着在不丢失安全的前提下,Web 应用技术能越来越强大、越来越丰富。比如,可以使用 XMLHttpRequest 发起跨站 HTTP 请求。(这段描述跨域不准确,跨域并非浏览器限制了发起跨站请求,而是跨站请求可以正常发起,但是返回结果被浏览器拦截了。最好的例子是crsf跨站攻击原理,请求是发送到了后端服务器无论是否跨域!注意:有些浏览器不允许从HTTPS的域跨域访问HTTP,比如Chrome和Firefox,这些浏览器在请求还未发出的时候就会拦截请求,这是一个特例。)

更多CORS介绍请看这里:

在WEB项目中,如果我们想支持CORS,一般都要通过过滤器进行实现,可以定义一些基本的规则,但是不方便提供更细粒度的配置,如果你想参考过滤器实现,你可以阅读下面这篇文章:

Spring MVC 从4.2版本开始增加了对CORS的支持

在 MVC 中增加CORS支持非常简单,可以配置全局的规则,也可以使用@CrossOrigin注解进行细粒度的配置。

使用@CrossOrigin注解

先通过源码看看该注解支持的属性:

@Target({ ElementType.METHOD, ElementType.TYPE })@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface CrossOrigin {    String[] DEFAULT_ORIGINS = { "*" };    String[] DEFAULT_ALLOWED_HEADERS = { "*" };    boolean DEFAULT_ALLOW_CREDENTIALS = true;    long DEFAULT_MAX_AGE = 1800;    /**     * 同origins属性一样     */    @AliasFor("origins")    String[] value() default {};    /**     * 所有支持域的集合,例如"http://domain1.com"。     * 

这些值都显示在请求头中的Access-Control-Allow-Origin * "*"代表所有域的请求都支持 *

如果没有定义,所有请求的域都支持 * @see #value */ @AliasFor("value") String[] origins() default {}; /** * 允许请求头重的header,默认都支持 */ String[] allowedHeaders() default {}; /** * 响应头中允许访问的header,默认为空 */ String[] exposedHeaders() default {}; /** * 请求支持的方法,例如"{RequestMethod.GET, RequestMethod.POST}"}。 * 默认支持RequestMapping中设置的方法 */ RequestMethod[] methods() default {}; /** * 是否允许cookie随请求发送,使用时必须指定具体的域 */ String allowCredentials() default ""; /** * 预请求的结果的有效期,默认30分钟 */ long maxAge() default -1;}

  

如果你对这些属性的含义不是很明白,建议阅读下面的文章了解更多:

下面举例在方法和Controller上使用该注解。

在Controller上使用@CrossOrigin注解

@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) {        // ...    }}

  

这里指定当前的AccountController中所有的方法可以处理http://domain2.com域上的请求,

在方法上使用@CrossOrigin注解

@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) {        // ...    }}

  

在这个例子中,AccountController类上也有@CrossOrigin注解,retrieve方法上也有注解,Spring会合并两个注解的属性一起使用。

CORS全局配置

除了细粒度基于注解的配置,你可能会想定义一些全局CORS的配置。这类似于使用过滤器,但可以在Spring MVC中声明,并结合细粒度@CrossOrigin配置。默认情况下所有的域名和GET、HEAD和POST方法都是允许的。

基于JAVA的配置

看下面例子

@Configuration@EnableWebMvcpublic class WebConfig extends WebMvcConfigurerAdapter {    @Override    public void addCorsMappings(CorsRegistry registry) {        registry.addMapping("/**");    }}

  您可以轻松地更改任何属性,以及配置适用于特定的路径模式的CORS:

@Configuration@EnableWebMvcpublic class WebConfig extends WebMvcConfigurerAdapter {    @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);    }}

  

如果你使用Spring Boot,你可以通过这种方式方便的进行配置。

基于XML的配置

  

这个配置和上面方式的第一种作用一样。

同样,你可以做更复杂的配置:

  

转载地址:http://olxzx.baihongyu.com/

你可能感兴趣的文章
针对web服务器容灾自动切换方案
查看>>
突破媒体转码效率壁垒 阿里云首推倍速转码
查看>>
容器存储中那些潜在的挑战和机遇
查看>>
R语言的三种聚类方法
查看>>
深入理解Python中的ThreadLocal变量(上)
查看>>
如果一切即服务,为什么需要数据中心?
查看>>
《游戏开发物理学(第2版)》一导读
查看>>
Erlang简史(翻译)
查看>>
深入实践Spring Boot2.4.2 节点和关系实体建模
查看>>
10个巨大的科学难题需要大数据解决方案
查看>>
Setting Up a Kerberos server (with Debian/Ubuntu)
查看>>
用 ThreadLocal 管理用户session
查看>>
setprecision后是要四舍五入吗?
查看>>
shiro初步 shiro授权
查看>>
上云就是这么简单——阿里云10分钟快速入门
查看>>
MFC多线程的创建,包括工作线程和用户界面线程
查看>>
我的友情链接
查看>>
FreeNAS8 ISCSI target & initiator for linux/windows
查看>>
cvs文件提交冲突解决方案
查看>>
PostgreSQL数据库集群初始化
查看>>