【Django】跨域和同源

同源

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章