同源
1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。同源策略:最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。所谓"同源"指的是"三个相同":域名、协议、端口号相同即为同源,同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。
不受同源策略限制:
- 页面中的链接,重定向以及表单提交是不会受到同源策略限制的。
- 跨域资源的引入是可以的。但是js不能读写加载的内容。如嵌入到页面中的script、img、link、iframe等。
跨域
同源策略虽然保证了用户信息的安全,但同时也使得实际开发中出现一些影响。例如实际开发中,将服务器端架设到一台服务器中,把客户端页面放到另外一个单独的服务器。那么这时候就会出现不同源的情况,这就需要使用到跨域 。
# 项目s1
def index(request):
date = {"name":"app1"}
ret = JsonResponse(date)
ret['Access-Control-Allow-Origin'] = "http://127.0.0.1:8001" # 设置响应头
return ret
<!--项目s2-->
<script>
$("#bt").click(function () {
$.ajax({
url:"http://127.0.0.1:8000/index/",
type:"post",
data:{"a":"1"},
success(res){
console.log(res)
}
})
})
</script>
CORS跨域资源共享
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request),只要同时满足以下两大条件,就属于简单请求。反之就属于非简单请求(复杂请求)。
简单请求
条件1:
请求方法是以下三种方法之一
- HEAD
- GET
- POST
条件2:
HTTP的头信息不超出以下几种字段
-
Accept
-
Accept-Language
-
Content-Language
-
Last-Event-ID
-
Content-Type:
只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
复杂请求
复杂请求时,首先会发送“预检”请求,如果“预检”成功,则发送真实数据。如果复杂请求,则服务端需要设置允许某请求Access-Control-Request-Method,否则“预检”不通过。如果复杂请求设置了请求头,则服务端需要设置允许某请求头Access-Control-Request-Headers,否则“预检”不通过
Django中解决跨域
# 返回结果中添加响应头
def index(request):
obj=HttpResponse(json.dumps({'num':'123'}))
# res['Access-Control-Allow-Headers'] = 'content-type'
# res['Access-Control-Allow-Methods'] = 'PUT'
# obj['Access-Control-Allow-Origin']='*'
obj['Access-Control-Allow-Origin']='http://127.0.0.1:8001'
return obj
# 中间件中添加响应头
from django.utils.deprecation import MiddlewareMixin
class MyCorsMiddle(MiddlewareMixin):
def process_response(self, request, response):
# response['Access-Control-Allow-Origin']='http://127.0.0.1:8001'
response['Access-Control-Allow-Origin'] = '*'
if request.method == 'OPTIONS':
# 所有的头信息都允许
response['Access-Control-Allow-Headers'] = '*'
return response