跨域解决方案之CORS

1.什么是CORS?

  CORS (Corss-Orign Resource Sharing):跨域资源共享。跨域资源共享是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。

 

2.使用场景

简单请求

条件:

  • 请求方法满足之一:GET、POST、HEAD
  • Content-Type满足之一:text/plain、multipart/form-data、application/x-www-form-urlencoded

 

Ps:服务端会检查Origin携带的源是否在许可范围,并返回一个正常的HTTP响应。浏览器会检查服务器响应是否携带Access-Control-Allow-Origin字段,没有则控制台报错。因此不可通过响应的状态码来判断请求是否成功。

 

预检请求

条件:

  • 请求方法满足之一:PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH
  • Content-Type不满足之一:text/plain、multipart/form-data、application/x-www-form-urlencoded

 

Ps:预检请求要求必须首先使用 OPTIONS   方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。

 

3.附带凭证的请求

  对应附带凭证的请求,服务器不可将Access-Control-Allow-Origin设置为"*",需要将Access-Control-Allow-Origin设置为具体的值,不然请求会失败。

 

4.SpringBoot对CORS跨域支持

  SpringBoot2以及SpringMVC4.2后支持CORS

错误:

Access to XMLHttpRequest at 'http://localhost:8080/info/getAllData' from origin 'http://127.0.0.1:8848' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

 

全局配置:

public void addCorsMappings(CorsRegistry registry){
        registry.addMapping("/**")
                .allowedOrigins("http://127.0.0.1:8848","http://localhost:8848");
    }

 

Ps:之前有一篇讲Restful:https://www.cnblogs.com/lightbc/p/12332378.html,在其中对swagger补充的地方添加上述全局配置即可。 

 

注解实现:

可使用@CrossOrigin注解,注解在Controller上表示整个Controller中的方法都可被跨域访问,注解在方法上表示该方法可以被跨域访问。效果如下:

 

Ps:

  1.其中http://127.0.0.1:8848为请求来源。

  2.CORS在低版本的浏览器中并未得到较好的支持。

posted @ 2020-02-22 16:37  lightbc  阅读(460)  评论(0编辑  收藏  举报