跨域问题

什么是跨域?

浏览器的同源策略:

请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同,
浏览器拒绝不是当前域域返回的数据

如果缺少同源策略,浏览器很容易受到XSS,CSFR等攻击。


通常情况下,A网页访问B服务器资源时,不满足以下三个条件其一就是跨域访问
1. 协议不同
2. 端口不同
3. 主机不同

同源策略限制以下几种行为:

1.Cookie、LocalStorage、IndexDB无法读取

2.DOM和JS对象无法获得

3.AJAX请求不能发送

如何解决:
CORS:跨域资源共享

整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。

因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

简单请求:发一次请求

解决简单的跨域问题:

http://127.0.0.1:8000 向 http://127.0.0.1:8001端口发请求

http://127.0.0.1:8001端口设置

obj=HttpResponse('数据')
obj['Access-Control-Allow-Origin']='http://127.0.0.1:8000'
return obj

非简单请求:

非简单请求是发送了两次请求,第一次是预检请求(OPTIONS请求),

当预检通过,允许我发请求,再发送真实的请求

同时满足以下两大条件,就是简单请求:

(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

django中解决跨域问题:

安装django-cors-headers模块

在settings.py中配置

INSTALLED_APPS = [
# 注册app
    ...
    'corsheaders'
]
# 添加中间件
MIDDLEWARE = [
    ...
    'corsheaders.middleware.CorsMiddleware'
]

# 允许跨域源
CORS_ORIGIN_ALLOW_ALL = True

解决跨域问题:(写好这个中间件注册一下)

class MyCorsMiddle(MiddlewareMixin):

    def process_response(self, request, response):
        if request.method == 'OPTIONS':
        # 允许它
           response['Access-Control-Allow-Headers'] = 'Content-Type'
                # obj['Access-Control-Allow-Headers']='*'
                # obj['Access-Control-Allow-Origin']='http://127.0.0.1:8000'
            response['Access-Control-Allow-Origin'] = '*'
            return response        
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务