跨域资源共享(CORS)

什么是跨域?


跨域资源共享(英语:Cross-origin resource sharing,缩写:CORS),用于让网页的受限资源能够被其他域名的页面访问的一种机制。

通过该机制,页面能够自由地使用不同源(英语:cross-origin)的图片、样式、脚本、iframes以及视频。一些跨域的请求(特别是Ajax)常常会被同源策略(英语:Same-origin policy)所禁止。跨源资源共享定义了一种方式,为的是浏览器和服务器之间能互相确认是否足够安全以至于能使用跨源请求(英语:cross-origin requests)。比起纯粹的同源请求,这将更为自由和功能性,但比纯粹的跨源请求更为安全。

跨域资源共享是一份浏览器技术的规范,提供了 Web 服务从不同网域传来沙盒脚本的方法,以避开浏览器的同源策略。

同源:同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。

同源策略:是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

CORS解决跨域问题


CORS请求分为两类:简单请求和非简单请求

简单请求

  • 请求方法为GET、POST、HEAD中的一种
  • HTTP请求头信息不超过下列几种

Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type(只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain)

满足上面两种情况的就是简单请求

非简单请求

  • 请求方法为PUT、DELET,或者Content-Type字段的类型是application/json
  • 非简单请求的CORS请求,会在正式通信之前,增加一次预检信息,就是OPTIONS请求,头信息里面,关键字段 Origin,表示请求来自哪个源,除 Origin 字段,"预检"请求的头信息包括两个特殊字段:

//该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法
Access-Control-Request-Method
//该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段.
Access-Control-Request-Headers

Go语言配置解决跨域拦截


	return func(c *gin.Context) {
		//请求方法
		method := c.Request.Method
		//请求源
		origin := c.Request.Header.Get("Origin")
		//必须配置,接收请求源的请求,*是允许所有请求源
		c.Header("Access-Control-Allow-Origin", origin)
		// 服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段
		c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token,X-Token,X-User-Id")
		// 必须配置,设置服务器支持的所有跨域请求的方法
		c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT")
		// 可选,设置XMLHttpRequest的响应对象能拿到的额外字段
		c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type, New-Token, New-Expires-At")
		// 可选,是否允许后续请求携带认证信息Cookir,该值只能是true,不需要则不设置
		c.Header("Access-Control-Allow-Credentials", "true")

		// 放行所有OPTIONS方法
		if method == "OPTIONS" {
			c.AbortWithStatus(http.StatusNoContent)
		}
		// 处理后续请求
		c.Next()
	}

你可能感兴趣的:(后端项目,gin,golang,网络协议,信息与通信,计算机网络)