zoukankan      html  css  js  c++  java
  • 跨域问题

    什么是跨域:

    浏览器的同源策略:

    请求的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中配置
    # 注册app
    INSTALLED_APPS = [
        ...
        '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
  • 相关阅读:
    android 4.0 中出错 java.lang.UnsupportedOperationException
    怎么确定你的CPU是否支持64位虚拟化
    宽度百分比单位的转换公式
    Test SRM Level Three: LargestCircle, Brute Force
    802.11(wifi)的MAC层功能
    zookeeper集群的python代码测试
    mysqldump 命令的使用
    xp硬盘安装Fedora14 过程记录及心得体会(fedora14 live版本680M 和fedora14 DVD版本3.2G的选择)
    ContentProvider的使用
    基于 Java 2 运行时安全模型的线程协作--转
  • 原文地址:https://www.cnblogs.com/python-Arvin/p/11946736.html
Copyright © 2011-2022 走看看