跨域问题和django中实现跨域

跨域问题


1.同源策略(浏览器的安全功能):
    请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同


2.CORS跨域资源共享
实现CORS通信的关键是服务器,只要服务器实现了CORS接口,就可以跨源通信

3.CORS请求分为简单请求和非简单请求


4.只要符合以下两个条件,就是简单请求,否则就是非简单请求
(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

#浏览器会判断是简单请求还是非简单请求,进行发送,区别如下
简单请求只发一次请求
非简单请求发两次:一次是OPTIONS预检请求,一次是真实的请求

5.支持跨域,简单请求
Access-Control-Allow-Origin = '域名' 或 '*'

支持跨域,复杂请求
由于复杂请求时,首先会发送“预检”请求,如果“预检”成功,则发送真实数据。
“预检”请求时,允许请求方式则需服务器设置响应头:Access-Control-Request-Method
“预检”请求时,允许请求头则需服务器设置响应头:Access-Control-Request-Headers

django中实现跨域

局部实现跨域
def test(request):
    import json
    obj=HttpResponse(json.dumps({'name':'lqz'}))
    # obj['Access-Control-Allow-Origin']='*'
    obj['Access-Control-Allow-Origin']='http://127.0.0.1:8004'
    return obj

全局实现跨域
#跨域时请求会发送到服务器,只是服务器不会正确的响应,故要实现全局跨域,需要自定义中间件,改写process_response将CORS接口设置为允许跨域

from django.utils.deprecation import MiddlewareMixin
class CorsMiddleWare(MiddlewareMixin):
    def process_response(self,request,response):
        if request.method=="OPTIONS":
            #可以加*,可以使用逗号,写多个头或方法
            response["Access-Control-Allow-Headers"]="Content-Type"
            response["Access-Control-Allow-Methods"]="PUT,DELETE"
        #处理简单跨域,不可以使用逗号分隔,增加多个允许的域,可以先定义变量ip_list =[],放入允许的域,判断ip = request.META.get('REMOTE_ADDR')是否在ip_list内,在的话将response['Access-Control-Allow-Origin']=ip
        response["Access-Control-Allow-Origin"] = "http://localhost:8080"
        return response

原文地址:https://www.cnblogs.com/robert-zhou/p/10651766.html