当然了,有三个标签本身就是允许跨域加载资源的:
- <img src=https://www.isolves.com/it/cxkf/yy/JAVA/2020-07-13/XXX>
- <link href=https://www.isolves.com/it/cxkf/yy/JAVA/2020-07-13/XXX>
- <script src=https://www.isolves.com/it/cxkf/yy/JAVA/2020-07-13/XXX>
出于安全原因,浏览器限制从脚本内发起的跨域 HTTP 请求 。例如,XMLHttpRequest 和 Fetch API 遵循同源策略 。也就是说使用这些 API 的 Web 应用程序只能从加载应用程序的同一个域请求 HTTP 资源,除非响应报文中包含了正确 CORS 响应头 。
通过在响应报文中设置额外的 HTTP 响应头来告诉浏览器,运行在某个 origin 上的 Web 应用被准许访问来自不同源服务器上的资源,此时浏览器就不会将该响应拦截掉了 。
那这些额外的 HTTP 响应头是什么呢?
响应头是否必须含义Access-Control-Allow-Origin是该字段表示,服务端接收哪些来源的域的请求Access-Control-Allow-Credentials否是否可以向服务端发送Cookie,默认是 falseAccess-Control-Expose-Headers否可以向请求额外暴露的响应头
其中只有 Access-Control-Allow-Origin 是必须的,该响应头的值可以是请求的 Origin 的值,也可以是 *,表示服务端接收所有来源的请求 。
当浏览器发起 CORS 请求时,默认只能获得6个响应头的值:
Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma
如果还需要返回其他的响应头给前端,则可以通过在 Access-Control-Expose-Headers 中指定 。
CORS的两种请求类型CORS有两种类型的请求,分别是:简单请求(simple request)和非简单请求(not-so-simple request)
只要同时满足以下两大条件,就属于简单请求 。
(1) 请求方法是以下三种方法之一:凡是不同时满足上面两个条件,就属于非简单请求,浏览器对这两种请求的处理,是不一样的 。
HEADGETPOST
(2) HTTP的头信息不超出以下几种字段:
AcceptAccept-LanguageContent-LanguageLast-Event-IDContent-Type:只限于三个值 Application/x-www-form-urlencoded 、multipart/form-data、text/plain
为什么会有两种不同类型的请求呢?
CORS 规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求 。
服务器确认允许之后,浏览器才能发起实际的 HTTP 请求 。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关的数据) 。
非简单请求就要求浏览器先发送一个预检请求,预检通过后再发送实际的请求 。
怎样实现CORS知道了CORS的实现机制之后,我们就可以解决遇到的CORS的问题了 。
1.通过JSONP利用 <script> 标签没有跨域限制的漏洞,网页可以得到从其他来源动态产生的 JSON 数据 。JSONP请求一定需要对方的服务器做支持才可以 。
JSONP 和 AJAX 相同,都是客户端向服务器端发送请求,从服务器端获取数据的方式 。但 AJAX 属于同源策略,JSONP 属于非同源策略(支持跨域请求) 。JSONP优点是简单兼容性好,可用于解决主流浏览器的跨域数据访问的问题 。缺点是仅支持 GET 方法具有局限性,不安全可能会遭受XSS攻击 。
2.利用反向代理服务器同源策略是浏览器需要遵循的标准,而如果是服务器向服务器请求就无需遵循同源策略
所以通过反向代理服务器可以有效的解决跨域问题,代理服务器需要做以下几个步骤:
1.接受客户端的请求
2.将请求转发给实际的服务器
3.将服务器的响应结果返回给客户端
Nginx就是类似的反向代理服务器,可以通过配置Nginx代理来解决跨域问题 。
3.服务端支持CORS最安全的还是服务端来设置允许哪些来源的请求,即服务端在接收到请求之后,对允许的请求源设置 Access-Control-Allow-Origin 的响应头 。
通过@CrossOrigin注解这里以 Spring Boot 为例,可以通过 @CrossOrigin 注解来指定哪些类或者方法支持跨越,如下列代码所示:
/** * 在类上加注解 */@CrossOrigin({"http://127.0.0.1:9528", "http://localhost:9528"})@RestControllerpublic class UserController {}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 牡丹花茶原料制作以及成分究竟是怎样的,玫瑰花茶到底是什么茶
- 怎么开通淘宝客赚佣金教程 怎样做淘宝客在淘宝上拿佣金
- 不同茶叶喝出不同肌肤,教你怎样调配花草茶
- 教您怎样用菊花茶来保护眼睛,菊花茶的功效与作用
- 淘宝退货率过高会怎样 淘宝卖家退货率
- 桂花茶怎样窨制,桂花茶的功效和作用
- 跨域保存cookie问题解决
- 高速公路收费标准是怎样的?
- 怎样煮方便面更好吃
- 怎样淹糖醋蒜好吃
