首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring的跨域CORS实现

Spring的跨域CORS实现

作者头像
十毛
发布2019-10-25 19:21:10
4680
发布2019-10-25 19:21:10
举报

今天项目遇到一个问题,Spring中有一些请求会映射到org.springframework.web.servlet.handler.AbstractHandlerMapping$PreFlightHandler,一开始一直不知道是什么请求触发的,后来才知道是前端同学使用了W3C的CORS标准实现跨域。其中针对一些复杂请求,浏览器会先使用OPTIONS发出请求,这个请求就会被PreFlightHandler处理。趁机了解一下如何CORS原理和Spring的支持方法。

什么是CORS

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。 CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。 整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。

  • 简单请求(simple request) 只要同时满足以下两大条件,就属于简单请求。
    • 请求方法是以下三种方法之一: HEAD GET POST
    • HTTP的头信息不超出以下几种字段: Accept Accept-Language Content-Language Last-Event-ID Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
  • 非简单请求(not-so-simple request) 凡是不同时满足上面两个条件,就属于非简单请求。

使用Options完成CORS非简单请求

OPTIONS /cors HTTP/1.1
Origin: http://api.bob.com
Access-Control-Request-Method: PUT

Spring MVC如何支持CORS

  • 直接在方法上使用注解@CrossOrigin
@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上使用注解@CrossOrigin
@CrossOrigin(origins = "http://example.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) {
        // ...
    }
}

与JSONP的比较

CORS与JSONP的使用目的相同,但是比JSONP更强大。

JSONP只支持GET请求,CORS支持所有类型的HTTP请求。JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。

参考

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.10.24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是CORS
  • 使用Options完成CORS非简单请求
  • Spring MVC如何支持CORS
  • 与JSONP的比较
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档