请求跨域问题

跨域

不同的域,ip+端口:

http://127.0.0.1:8001/
http://162.0.0.1:8001/
http://127.0.0.1:8002/

同源策略:

浏览器的安全策略,请求发出去了,也正常响应了,但是被浏览器拦截了
处理这个问题:跨域问题
  -CORS(跨域资源共享)后端的技术

CORS两种

--

请求分类

什么是简单请求
    (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

简单请求:

  满足简单请求的条件,发一次请求;

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

 

非简单请求:

  不满足简单请求条件,发两次请求,一次是OPTIONS预检请求,一次是真正的请求;

#数据格式不符合简单请求

<button id="btn">点我发请求</button>

<script>
    $("#btn").click(function () {
        $.ajax({
            url:'http://127.0.0.1:8000/v1/publishs/',
            type:'get',
            {#type:'delete',#}
            {#type:'put',#}
            contentType:'application/json',
            data:JSON.stringify({'name':'lqz'}),
            success:function (data) {
                console.log(data)
            }
        })
    })
</script>

中间件配置简单/非简单请求

from django.utils.deprecation import MiddlewareMixin
class CORSMiddle(MiddlewareMixin):
    def process_response(self,request,response):
        # 简单请求
        response['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8001'
        # 非简单请求,
        if request.method == 'OPTIONS':
            # 如果是put和delete方法,重新再发一次请求
            response['Access-Control-Allow-Methods'] = 'PUT,DELETE'
            response['Access-Control-Allow-Headers']='Content-Type'
        return response

mid.py
mid.py
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    #配置到中间件
    'app01.mid.CORSMiddle',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
settings.py

设置跨域请求白名单

安装

pip install django-cors-headers

添加应用

在settings里面配置

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

中间层设置

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    ...
]

添加白名单

# CORS
CORS_ORIGIN_WHITELIST = (
    '127.0.0.1:8080',
    'localhost:8080', #凡是出现在白名单中的域名,都可以访问后端接口
)
CORS_ALLOW_CREDENTIALS = True  # 指明在跨域访问中,后端是否支持对cookie的操作

 

posted @ 2019-02-26 21:15  ChuckXue  阅读(154)  评论(0)    收藏  举报