美文网首页
Spring的跨域CORS实现

Spring的跨域CORS实现

作者: 十毛tenmao | 来源:发表于2019-10-24 23:18 被阅读0次

    今天项目遇到一个问题,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的网站请求数据。

    参考

    相关文章

      网友评论

          本文标题:Spring的跨域CORS实现

          本文链接:https://www.haomeiwen.com/subject/myfjvctx.html