zoukankan      html  css  js  c++  java
  • 跨域问题和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
    
    
  • 相关阅读:
    linux部署docker镜像
    SpringBoot 定时任务篇
    POST形式 soapUI调用WebService的restful接口,传入json参数,并且返回json
    Java操作FTP工具类(实例详解)
    MyBatis逆向工程:根据table生成Model、Mapper、Mapper.xml
    Netty完成网络通信(二)
    NIO完成网络通信(一)
    MySQL5.6数据库8小时内无请求自动断开连接
    Eclipse集成Tomcat插件(特别简单)
    程序从sqlserver2008搬家到MySQL5.6
  • 原文地址:https://www.cnblogs.com/robert-zhou/p/10651766.html
Copyright © 2011-2022 走看看