zoukankan      html  css  js  c++  java
  • 跨域请求

    同源策略

    同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现

    请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同.

    比如:我在本地上的域名是127.0.0.1:8000,请求另外一个域名:127.0.0.1:8001一段数据

    浏览器上就会报错

    例子

    朝一个不同域的url地址发送请求,浏览器报错

    解决方法:如下

    CORS(跨域资源共享)简介

    CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。

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

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

    在后台添加一个配置就行了

        def get(self,request,*args,**kwargs):
            print('get请求来了')
            obj=HttpResponse('ok')
            obj['Access-Control-Allow-Origin']='http://127.0.0.1:8000' #允许哪个域的url地址
            return obj

    浏览器就不会报错了

    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

    凡是不同时满足上面两个条件,就属于非简单请求。

    浏览器对这两种请求的处理,是不一样的。

    非简单请求

    两次请求,在发送数据之前会先发一次请求用于做“预检”(OPTIONS请求),只有“预检”通过后才再发送一次请求用于数据传输。

    这里发的是json格式所以不符合简单请求的要求,浏览器也报错

    非简单请求第一次是发送预检请求OPTIONS

    现在需要允许通过,发送post数据

    后台views.py

    def index(request):
        obj = HttpResponse('ok')
        if request.method == 'OPTIONS':
            # 允许请求
            #请求头任意的东西都可以
            obj["Access-Control-Allow-Headers"] = "*"
    
        obj['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8000'  # 允许哪个域的url地址
        return obj

    解决跨域问题 

    写在视图函数里面不合适,应该写在中间件里,在应用目录下新建一个py文件,如果不知道中间件继承的是谁,可以复制一条中间件改为

    from django.middleware.security import SecurityMiddleware

    点进SecurityMiddleware里面看一下就知道了

    from django.utils.deprecation import MiddlewareMixin
    
    class CorsMiddle(MiddlewareMixin):
        def process_response(self, request, response):
            if request.method == 'OPTIONS':
                response["Access-Control-Allow-Headers"] = "*"
            response['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8000'  # 允许哪个域的url地址
            return response

    记得在settings里面注册中间件

    MIDDLEWARE = [
        'app01.middle.CorsMiddle',
    ]

    以后就可以把自己写的中间件放到别的项目里面用

  • 相关阅读:
    location url 反向代理到来机的其它端口 gitlab
    PortSentry是入侵检测工具中配置最简单、效果最直接的工具之一
    iptables下state的4种形式
    windows  远程桌面命令 mstsc
    linux中解决SSH连接慢问题 关键点GSSAPIAuthentication
    无密码登录远程主机
    openfire 服务器名称:后面的黄色叹号
    ssh -v root@xxxxx 显示登录的细节
    mysql 只导数据不含表结构
    磁盘空间占满inode结点没用完 并删除了文件但是释放不了
  • 原文地址:https://www.cnblogs.com/zhengyuli/p/11153189.html
Copyright © 2011-2022 走看看