跨域问题

浏览器同源策略

它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现,是浏览器对访问到的结果进行了拦截。

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

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

浏览器上就会报错,这个就是同源策略的保护,如果浏览器对javascript没有同源策略的保护,那么一些重要的机密网站将会很危险。

跨域资源共享

通过一些办法

允许不同的域去服务器拿数据

首先要知道跨域请求分类

  • 简单请求
只要同时满足以下两大条件,就属于简单请求
    (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

# 通过预检的方式
     => 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则“预检”不通过
        Access-Control-Request-Method
     => 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则“预检”不通过
        Access-Control-Request-Headers

解决跨域问题

简单请求跨域问题解决

由于在浏览器中的报错信息提示:
No 'Access-Control-Allow-Origin' header is present on the requested resource.

因此需要为服务器设置响应头:
Access-Control-Allow-Origin = ‘域名’ 或 ‘*’

代码示例

# 被访问的服务端的视图类代码
from rest_framework.views import APIView
from rest_framework.response import Response


class TestView(APIView):
    def get(self,request):
        print('green_nb')
        # 需要在被访问的服务端的response对象中加入'Access-Control-Allow-Origin':'http://127.0.0.1:8002',意思就是当我向http://127.0.0.1:8002发送数据时,对方浏览器允许接收我的数据
        return Response('ok',headers={'Access-Control-Allow-Origin':'http://127.0.0.1:8002'})


    def post(self,request):
        print('green_super_nb')
        return Response('ok',headers={'Access-Control-Allow-Origin':'http://127.0.0.1:8002'})

非简单请求跨域问题解决

方案:使用自定义中间件

from django.utils.deprecation import MiddlewareMixin


class CorsMiddleware(MiddlewareMixin):
    def process_response(self, request, response):
        response['Access-Control-Allow-Origin'] = '*'
        if request.method not in ['POST', 'GET']:
            response['Access-Control-Allow-Headers'] = 'Content-Type'
        return response

作者:Esofar

出处:https://www.cnblogs.com/Hqqqq/p/18184558

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   HuangQiaoqi  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示