解决跨域问题

一、为什么会有跨域问题?

是因为浏览器的同源策略是对不同源的ajax请求进行阻拦,但是不是所有的请求都给做跨域,像是一般的href属性,a标签什么的都不拦截。还可以把路径写在script中。

解决跨域问题的两种方式

  • JSONP
  • CORS

先来说说CORS吧

随着技术的发展,现在的浏览器可以主动支持设置从而允许跨域请求,即:跨域资源共享(CORS,Cross-Origin Resource Sharing),其本质是设置响应头,使得浏览器允许跨域请求。

1.CORS中的简单请求和复杂请求

条件:
    1、请求方式:HEAD、GET、POST
    2、请求头信息:
        Accept
        Accept-Language
        Content-Language
        Last-Event-ID
        Content-Type 对应的值是以下三个中的任意一个
                                application/x-www-form-urlencoded
                                multipart/form-data
                                text/plain
 
注意:同时满足以上两个条件时,则是简单请求,否则为复杂请求

  如果一个请求同时满足上面的所有要求那么就是简单请求否则就是复杂请求。

2.简单请求和复杂请求的区别

简单请求:一次请求

非简单请求:两次请求,在发送数据之前会先发第一次请求做‘预检’,只有‘预检’通过后才再发送一次请求用于数据传输。

3、关于预检

- 请求方式:OPTIONS
- “预检”其实做检查,检查如果通过则允许传输数据,检查不通过则不再发送真正想要发送的消息
- 如何“预检”
     => 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则“预检”不通过
        Access-Control-Request-Method
     => 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则“预检”不通过
        Access-Control-Request-Headers

可以放在中间件中:

class CORS(object):

    def process_response(self,request,response):
        if request.method == 'OPTIONS':
            response['Access-Control-Allow-Origin'] = '*'
            response['Access-Control-Allow-Methods'] = 'PUT,DELETE'
            response['Access-Control-Allow-Headers'] = 'k1'
            return response
        else:
            response['Access-Control-Allow-Origin'] = '*'
            return response

4. cors的优缺点

  • CORS的优点:可以发任意请求
  • CORS的缺点:上是复杂请求的时候得先做个预检,再发真实的请求。发了两次请求会有性能上的损耗

 

posted @ 2018-04-11 15:03  沈俊杰  阅读(96)  评论(0)    收藏  举报