ajax跨域原理(2) cors跨域资源共享

不需要设置前端太多,只需要在服务端是在请求头,使服务端的回复数据可以正常通过浏览器的限制,进入网站

首先说下简单请求和非简单请求:

简单请求:必须满足下列条件

1.请求方式:head,get,post

2.请求头

Accept

Accept-Language

Content-Language

Last-Event-ID

Content-Type:其对应值限制为3个application/x-www-form-urlencoded,multipart/form-data,text/plain

必须同时满足上面的两个条件叫做简单请求

简单请求:跨站请求时只需要一次请求

非简单请求:两次请求,在发送请求之前会先发送一次请求(预检),通过预检的才能再次发送一次请求进行数据传输

一:简单请求

前端:正常设置信息

    function CorsAjax(){
        $.ajax({
            url:‘http://www.py_test2.com:8081/cors‘,
            dataType:‘text‘,
            data:{},
            type:"post",
            success:function(data){
                console.log(data);
            }
        })
    }

后台服务端(跨域方)需要设置请求头:

    #简单请求
    def post(self, *args, **kwargs):
        self.set_header(‘Access-Control-Allow-Origin‘,"http://www.py_test1.com:8080,http://www.py_test1.com:8080")#设置一个或多个都可以,或者加上*代表所有的都允许
        self.write(‘{"status":1,"message":"post"}‘)

二:复杂请求:需要先发送一次预检

而预检的请求方式为options,所以我们需要在服务端设置一个options请求来处理预检信息

1.当前端的请求方式不满足条件时:

    //复杂请求,会发送两个请求,一个options一个put
    function CorsAjax2(){
        $.ajax({
            url:‘http://www.py_test2.com:8081/cors‘,
            dataType:‘text‘,
            data:{},
            type:"put",
            success:function(data){
                console.log(data);
            }
        })
    }

需要在服务端设置预检

    #复杂请求
    def options(self, *args, **kwargs):#第一次用于预检
        #先允许网站接入
        self.set_header(‘Access-Control-Allow-Origin‘, "http://www.py_test1.com:8080")
        #若是请求方法不满足get,post,head
        self.set_header(‘Access-Control-Allow-Methods‘,"PUT,DELETE")#还可以添加其他,比如DELETE,不能是*
    def put(self, *args, **kwargs):#第二次为请求,用于数据传输       self.set_header(‘Access-Control-Origin‘,‘http://www.py_test1.com:8080‘) #也要设置源地址
            self.write(‘put ok‘)

2.当客户端请求头也不满足时:

    //复杂请求,会发送两个请求,一个options一个put
    function CorsAjax2(){
        $.ajax({
            url:‘http://www.py_test2.com:8081/cors‘,
            dataType:‘text‘,
            data:{},
            type:"put",
            headers:{‘k1‘:‘ddasf‘,"k2":‘fa‘},
            success:function(data){
                console.log(data);
            }
        })
    }

服务端需要设置关于请求头的信息

    #复杂请求
    def options(self, *args, **kwargs):#第一次用于预检
        #先允许网站接入
        #self.set_header(‘Access-Control-Allow-Origin‘,"*")  # 或者加上*代表所有的都允许
        #如果客户端允许传递cookie,那么这里请求头就不能是*,必须是指定的url
        self.set_header(‘Access-Control-Allow-Origin‘, "http://www.py_test1.com:8080")
        #若是请求方法不满足get,post,head
        self.set_header(‘Access-Control-Allow-Methods‘,"PUT,DELETE")#还可以添加其他,比如DELETE,不能是*
        #若是请求头也不满足简单请求,也需要设置
        self.set_header(‘Access-Control-Allow-Headers‘, "k1,k2")#客户端自定义请求头

对于客户端预检可以设置缓存时间,在相应时间内,不会再进行预检

        #可以设置缓存时间,原来需要一次预检一次请求,现在只需要一次请求
        self.set_header(‘Access-Control-Max-Age‘,10)#10秒内不再产生预检

对于请求头,若是服务端想要自定义请求都传入客户端:需要进行以下操作

    def put(self, *args, **kwargs):#第二次为请求
        #服务端自定义响应头
        #self.set_header(‘xxoo‘,‘seven‘)
        #self.set_header(‘bili‘,‘daobidao‘)#这样是客户端无法接收
        #还需要设置一条
        #self.set_header(‘Access-Control-Expose-Headers‘,"xxoo,bili")

3.当客户端允许携带cookie时

需要在客户端设置XMLHttpRequest的withCredentials为true

    //复杂请求,会发送两个请求,一个options一个put
    function CorsAjax2(){
        $.ajax({
            url:‘http://www.py_test2.com:8081/cors‘,
            dataType:‘text‘,
            data:{},
            type:"put",
            headers:{‘k1‘:‘ddasf‘,"k2":‘fa‘},
            xhrFields:{withCredentials:true},//默认是不允许携带cookie和ssl证书等,需要设置,服务端也要相应设置
            success:function(data){
                console.log(data);
            }
        })
    }

注意在服务端响应时不允许设置Access-Control-Allow-Origin为通配符*

#若是客户端传递cookie进入,需要设置允许证书等
        self.set_header(‘Access-Control-Allow-Credentials‘,"true")

完整代码

    #复杂请求
    def options(self, *args, **kwargs):#第一次用于预检
        #先允许网站接入
        #self.set_header(‘Access-Control-Allow-Origin‘,"*")  # 或者加上*代表所有的都允许
        #如果客户端允许传递cookie,那么这里请求头就不能是*,必须是指定的url
        self.set_header(‘Access-Control-Allow-Origin‘, "http://www.py_test1.com:8080")
        #若是请求方法不满足get,post
        self.set_header(‘Access-Control-Allow-Methods‘,"PUT,DELETE")#还可以添加其他,比如DELETE,不能是*
        #若是请求头也不满足简单请求,也需要设置
        self.set_header(‘Access-Control-Allow-Headers‘, "k1,k2")#客户端自定义请求头
        #若是客户端传递cookie进入,需要设置允许证书等
        self.set_header(‘Access-Control-Allow-Credentials‘,"true")
        #可以设置缓存时间,原来需要一次预检一次请求,现在只需要一次请求
        self.set_header(‘Access-Control-Max-Age‘,10)#10秒内不再产生预检

在第二次请求中:可以设置cookie,并获取

    def put(self, *args, **kwargs):#第二次为请求
        #由于设置了cookie,所有这里不允许*
        #self.set_header(‘Access-Control-Allow-Origin‘, "*")
        self.set_header(‘Access-Control-Allow-Origin‘,"http://www.py_test1.com:8080")
        self.set_header(‘Access-Control-Allow-Credentials‘,"true")
        #为跨域站点设置cookie
        print(self.cookies)
        self.set_cookie(‘kk‘,‘21‘)
        self.write(‘put ok‘)

注意第二次请求也是需要设置Access-Control-Allow-Origin的

而且由于cookie的添加需要设置Access-Control-Allow-Credentials

前端完整:

<script>
    function CorsAjax(){
        $.ajax({
            url:‘http://www.py_test2.com:8081/cors‘,
            dataType:‘text‘,
            data:{},
            type:"post",
            success:function(data){
                console.log(data);
            }
        })
    }

    //复杂请求,会发送两个请求,一个options一个put
    function CorsAjax2(){
        $.ajax({
            url:‘http://www.py_test2.com:8081/cors‘,
            dataType:‘text‘,
            data:{},
            type:"put",
            headers:{‘k1‘:‘ddasf‘,"k2":‘fa‘},
            xhrFields:{withCredentials:true},//默认是不允许携带cookie和ssl证书等,需要设置,服务端也要相应设置
            success:function(data){
                console.log(data);
            }
        })
    }

服务端完整:

class CorsHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write(‘{"status":1,"message":"get"}‘)

    #简单请求
    def post(self, *args, **kwargs):
        self.set_header(‘Access-Control-Allow-Origin‘,"http://www.py_test1.com:8080,http://www.py_test1.com:8080")#或者加上*代表所有的都允许
        self.write(‘{"status":1,"message":"post"}‘)

    #复杂请求
    def options(self, *args, **kwargs):#第一次用于预检
        #先允许网站接入
        #self.set_header(‘Access-Control-Allow-Origin‘,"*")  # 或者加上*代表所有的都允许
        #如果客户端允许传递cookie,那么这里请求头就不能是*,必须是指定的url
        self.set_header(‘Access-Control-Allow-Origin‘, "http://www.py_test1.com:8080")
        #若是请求方法不满足get,post
        self.set_header(‘Access-Control-Allow-Methods‘,"PUT,DELETE")#还可以添加其他,比如DELETE,不能是*
        #若是请求头也不满足简单请求,也需要设置
        self.set_header(‘Access-Control-Allow-Headers‘, "k1,k2")#客户端自定义请求头
        #若是客户端传递cookie进入,需要设置允许证书等
        self.set_header(‘Access-Control-Allow-Credentials‘,"true")
        #可以设置缓存时间,原来需要一次预检一次请求,现在只需要一次请求
        self.set_header(‘Access-Control-Max-Age‘,10)#10秒内不再产生预检

    def put(self, *args, **kwargs):#第二次为请求
        #服务端自定义响应头
        #self.set_header(‘xxoo‘,‘seven‘)
        #self.set_header(‘bili‘,‘daobidao‘)#这样是客户端无法接收
        #还需要设置一条
        #self.set_header(‘Access-Control-Expose-Headers‘,"xxoo,bili")

        #由于设置了cookie,所有这里不允许*
        #self.set_header(‘Access-Control-Allow-Origin‘, "*")
        self.set_header(‘Access-Control-Allow-Origin‘,"http://www.py_test1.com:8080")
        self.set_header(‘Access-Control-Allow-Credentials‘,"true")
        #为跨域站点设置cookie
        print(self.cookies)
        self.set_cookie(‘kk‘,‘21‘)
        self.write(‘put ok‘)

更多信息来源可以看此处

简单请求 OR 非简单请求


1

2

3

4

5

6

7

8

9

10

11

12

13

条件:

    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

注意:同时满足以上两个条件时,则是简单请求,否则为复杂请求

原文地址:https://www.cnblogs.com/ssyfj/p/8536011.html

时间: 2024-10-13 04:16:25

ajax跨域原理(2) cors跨域资源共享的相关文章

浅谈跨域以WebService对跨域的支持

跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问.也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源. 在以前,前端和后端混杂在一起, 比如JavaScript直接调用同系统里面的一个Httphandler,就不存在跨域的问题,但是随着现代的这种多种客户端的流行,比如一个应用通常会有Web端,App端,以及WebApp端,各种客户端通常会使用同一套的后台处理逻辑,即API, 前后端分离的开发策略流行起来

前端筑基篇(一)-&gt;ajax跨域原理以及解决方案

说明 跨域主要是由于浏览器的“同源策略”引起,分为多种类型,本文主要探讨Ajax请求跨域问题 前言 参考来源 什么是跨域 ajax跨域的表现 跨域的原理 如何解决跨域问题 JSONP方式解决跨域问题 CROS解决跨域问题 CROS请求原理 PHP后台配置 JAVA后台配置 .NET后台配置 FAQ multi value '*,*' 的问题 前言 强烈推荐阅读参考来源中的文章,能够快速帮助了解跨域的原理 参考来源 本文参考了以下来源 浏览器同源政策及其规避方法(阮一峰) 跨域资源共享 CORS

ajax跨域原理以及解决方案

说明 跨域主要是由于浏览器的“同源策略”引起,分为多种类型,本文主要探讨Ajax请求跨域问题 前言 强烈推荐阅读参考来源中的文章,能够快速帮助了解跨域的原理 参考来源 本文参考了以下来源 浏览器同源政策及其规避方法(阮一峰) 跨域资源共享 CORS 详解(阮一峰) 什么是跨域 为了更了解跨域的原理,可以阅读参考来源中的文章,里面对跨域的原理讲解很详细到位 ajax跨域的表现 ajax请求时,如果存在跨域现象,并且没有进行解决,会有如下表现 第一种现象:No 'Access-Control-All

前端随心记---------Ajax原理及实现跨域方法

Ajax原理: Ajax的原理简单来说就是通过XmlHttpRequest对象来向服务器发送异步请求,从服务器获得数据,然后用JavaScript来操作dom从而更新页面.这其中最关键的一步就是从服务器获得请求数据. XmlHttpRequest是Ajax的核心机制,它是在IE5中首先引入的,是一种支持异步请求的技术.简单的说,也就是JavaScript可以 及时向服务器提出请求和处理响应,而不阻塞用户,达到无刷新的效果. ajax实际上是异步的javascript和xml. 原生js实现aja

解决ajax请求cors跨域问题

”已阻止跨源请求:同源策略禁止读取位于 ***** 的远程资源.(原因:CORS 头缺少 'Access-Control-Allow-Origin').“ ”已阻止跨源请求:同源策略禁止读取位于 ******的远程资源.(原因:CORS 请求失败).“ 在项目中或者练习中经常遇到ajax请求跨域的问题,除了可以用jsonp的请求模式,并且在后台支持回调的方式以外,还可以通过简单的配置webconfig文件或者IIS,解决该问题. 一.通过修改配置文件解决CORS跨域问题 在配置文件中的webse

jquery ajax CORS 跨域访问 WebService

JS代码: var word = document.getElementById("word").value; $.ajax({ type: "POST", contentType: "application/x-www-form-urlencoded", url: "http://localhost:12805/WebService.asmx/HelloWorld", data: 'data=' + word, dataTy

ajax——CORS跨域调用REST API 的常见问题以及前后端的设置

RESTful架构是目前比较流行的一种互联网软件架构,在此架构之下的浏览器前端和手机端能共用后端接口. 但是涉及到js跨域调用接口总是很头疼,下边就跟着chrome的报错信息一起来解决一下. 假设:前端域名为front.ls-la.me,后端域名为api.ls-la.com.前端需要访问的接口为http://api.ls-la.com/user/info.json,需要用GET方式访问. 现在,用Ajax向后端发送请求,得到第一个错误.(cors跨域的写法参考:http://blog.csdn.

js ajax跨域被阻止 CORS 头缺少 &#39;Access-Control-Allow-Origin&#39;(转)

今天ajax请求域名的时候出现 已阻止跨源请求:同源策略禁止读取位于 http://www.zuimeimami.com*****的远程资源.(原因:CORS 头缺少 'Access-Control-Allow-Origin'). 解决办法1: var url='http://localhost:8080/WorkGroupManagment/open/getGroupById" +"?id=1&callback=?'; $.ajax({ url:url, dataType:'

CORS——跨域请求那些事儿

在日常的项目开发时会不可避免的需要进行跨域操作,而在实际进行跨域请求时,经常会遇到类似 No 'Access-Control-Allow-Origin' header is present on the requested resource.这样的报错.这样的错误,一般是由于CORS跨域验证机制设置不正确导致的,本文将详细讲解CORS跨域验证机制的原理,让您轻松掌握CORS跨域设置的使用方法,安全.方便的进行前端开发. 什么是CORS CORS(Cross-Origin Resource Sha