CORS跨域请求之简单请求与非简单请求

20 篇文章 0 订阅
6 篇文章 0 订阅

原文地址:https://www.cnblogs.com/renpingsheng/p/7688134.html
先来看一个例子

定义 server01 的项目,在路由表中添加一条路由记录

url(r'^getData.html$',views.get_data)

对应的视图函数

from django.shortcuts import render,HttpResponse
    
    def get_data(request):
    
        response=HttpResponse("server----001")
        return response

定义 server02 项目,在路由表中添加一条路由记录

url(r'^index.html/',views.index),

对应的视图函数

from django.shortcuts import render
    
    def index(request):
    
        return render(request,"index.html")

对应的index.html文件

<!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>server----002</h1>
    <script src="/static/jquery-3.2.1.js"></script>
    <script>
        $.ajax({
            url:'http://127.0.0.1:8000/getData.html',
            type:'GET',
            success:function(data){
                console.log(data);
            }
        })
    </script>
    </body>
    </html>

运行server01项目,使用8100端口打开server02的index.html网页,可以看到如下信息
在这里插入图片描述
发送这个请求使用的是GET方法.如果把server02的index.html网页中设定为使用PUT方法发送请求,会看到什么情况呢?
把index.html中的请求方法修改为PUT,然后刷新浏览器
在这里插入图片描述
可以看到网页上显示的request method变成了OPTIONS,可是在网页中声明的请求方法是PUT呀

为什么会出现这样的情况呢???这就涉及到简单请求和非简单请求了.
简单请求就是使用设定的请求方式请求数据
而非简单请求则是在使用设定的请求方式请求数据之前,先发送一个OPTIONS请求,看服务端是否允许客户端发送非简单请求.
只有"预检"通过后才会再发送一次请求用于数据传输

简单请求与非简单请求的区别

* 请求方式:HEAD,GET,POST
* 请求头信息:
    Accept
    Accept-Language
    Content-Language
    Last-Event-ID
    Content-Type 对应的值是以下三个中的任意一个
                        application/x-www-form-urlencoded
                        multipart/form-data
                        text/plain

只有同时满足以上两个条件时,才是简单请求,否则为非简单请求。

如果在上面的例子中,在server01中设定响应头

from django.shortcuts import render,HttpResponse
    
    def get_data(request):
        if request.method=="OPTIONS":
        
            response=HttpResponse()
            response['Access-Control-Allow-Origin']="*"
            response['Access-Control-Allow-Methods']="PUT"
            return response
        elif request.method =="PUT":
        
            response=HttpResponse("server----001")
            response['Access-Control-Allow-Origin']="*"
            return response

再次刷新http://127.0.0.1:8100/index.html/网页,可以看到
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
先发送的是OPTIONS请求,第二次发送的是PUT请求,而且获取到目标字符串.
由此得知,对于非简单请求,客户端以PUT方式请求数据,服务端的"预检"里边一定要包含允许客户端使用非简单方式请求数据的响应头

“预检”请求时,允许请求方式则需服务器设置响应头:Access-Control-Request-Method
“预检”请求时,允许请求头则需服务器设置响应头:Access-Control-Request-Headers
“预检”缓存时间,服务器设置响应头:Access-Control-Max-Age

虽然可以通过设置响应头和响应方式等支持非简单请求,但是不到万不得已的情况,不能允许客户端发送非简单请求.

因为非简单请求会使服务器比简单请求的多一倍的压力.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值