首页 > 其他分享 >前后端分离-跨域问题详解

前后端分离-跨域问题详解

时间:2023-02-28 19:36:17浏览次数:42  
标签:浏览器 跨域 简单 分离 详解 CORS response 请求

一、跨域问题详解

什么是跨域问题:

跨域问题只会出现在前后端分离项目中,在前后端分离项目中,前端发送ajax请求到后端会跨域问题拦截,导致这个问题的原因是“同源策略”

什么是同源策略:

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

-发送ajax请求的地址,必须跟浏览器上的url地址处于同域上 
	# 域 [域名,地址,端口,协议]
-请求成功,数据库返回,但是浏览器拦截

# 补充:浏览器中输入域名,没有加端口
    -www.baidu.com---->dns--->解析成地址  192.168.2.3----》没有加端口,默认是80
    -dns解析,先找本地的host文件
    -可以修改本地的host做映射

img

解决同源策略的方式:

  • 方式一:CORS 后端代码控制(本次所讲解)
  • 方式二:Nginx反向代理 (常用)
  • 方式三:搭建Node代理服务器
  • 方式四:JSONP 很老,不会用了,只能发get请求

1、CORS解决跨域问题

简介:

cors(跨域资源共享),第三方模块,后端技术,通过在响应头中加入固定的头,来解决跨域问题

cors基本流程:

浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。

  • 简单请求:
    • 浏览器发出CORS简单请求,只需要在头信息之中增加一个Origin字段。
  • 非简单请求:
    • 浏览器发出CORS非简单请求,会在正式通信之前,增加一次HTTP查询请求,称为”预检”请求(preflight)。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错

什么是简单请求和非简单请求:

符合以下条件的请求就是简单请求,反之就是非简单请求

(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,如果允许,再发真正的请求

cors解决跨域问题:

# 第一步:安装
	pip install django-cors-headers
# 第二步:配置app
    INSTALLED_APPS = [
        'corsheaders'
    ]

# 第三步:配置中间件
    MIDDLEWARE = [
        'corsheaders.middleware.CorsMiddleware',
    ]
# 第四步:在配置文件配置
# 允许所有域
CORS_ORIGIN_ALLOW_ALL = True
# 允许的请求方式
CORS_ALLOW_METHODS = (
	'DELETE',
	'GET',
	'OPTIONS',
	'PATCH',
	'POST',
	'PUT',
	'VIEW',
)
# 允许请求头中加的东西
CORS_ALLOW_HEADERS = (
	'XMLHttpRequest',
	'X_FILENAME',
	'accept-encoding',
	'authorization',
	'content-type',
	'dnt',
	'origin',
	'user-agent',
	'x-csrftoken',
	'x-requested-with',
	'Pragma',
	'token',
)

2、自己编写代码解决跨域问题

思路:

  • 当请求进入django时,拦截请求进行判断
  • 如果是简单请求直接在响应头中加入"Access-Control-Allow-Origin"
    • 指是否允许该域名访问
  • 如果是非简请求,在响应头中加入"Access-Control-Allow-Headers"
    • 指是否允许在响应头中添加的字段
  • 将编写的代码注册成中间件,这样就不会出现跨域问题
from django.utils.deprecation import MiddlewareMixin
class CorsMiddleWare(MiddlewareMixin):
    def process_response(self,request,response):
        if request.method=="OPTIONS":  # 解决非简单请求的请求头
            #可以加*
            response["Access-Control-Allow-Headers"]="*"

        # 允许前端的地址,所有请求头允许
        response["Access-Control-Allow-Origin"] = "*"
        return response

标签:浏览器,跨域,简单,分离,详解,CORS,response,请求
From: https://www.cnblogs.com/kangssssh/p/17165664.html

相关文章

  • Kerberos协议详解
    kerberos0x00简介Kerberos是一种网络认证协议,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无......
  • 对于如何在IDEA中给Terminal添加git的详解
    具体步骤1、配置本机环境变量进入到环境变量的设置界面,然后找到下面的Path变量,双击点开;然后新建一个变量,路径定义到git的目录下面的bin目录下;2、WIN+R,然后输入cmd,进入......
  • 关于如何在IDEA里面配置好Git和Github的相关步骤详解
    配置Git1、File->settings然后选择其中的VersionControl:接着选择其中的Git选项:2、将文本框内容定位到本地下载git路径下面然后点击右边的Test测试一下,若是显示出......
  • WPF中图形表示语法详解(Path之Data属性语法)
    老规矩,看图说话。先看显示效果:(图1)XAML(代码A):<Pagexmlns="​​http://schemas.microsoft.com/winfx/2006/xaml/presentation​​​"xmlns:x="​​http://schemas.microsof......
  • SICK新品 | 智能激光型光电传感器W12L详解
    随着智能制造的发展与普及,越来越多的行业对传感器提出了新的要求。不仅检测上要实现稳定精准,传感器本身也要具有向上层集成的能力。比如:汽车行业:自动化程度高,各工艺衔接段......
  • 详解http和https
    前言大家好,我是小卷!近几年,互联网发生着翻天覆地的变化,尤其是我们一直习以为常的HTTP协议,在逐渐的被HTTPS协议所取代,在浏览器、搜索引擎、CA机构、大型互联网企业的共同促......
  • 【django-vue】前端取消默认样式 main.js配置 后端主页模块接口 跨域问题详解 项目自
    目录回顾上节课回顾今日内容1前端全局样式和js配置1.1global.css1.2settings.js1.3main.js2后端主页模块接口三种开发模式模型父类BaseModel轮播图模型类代码轮播图接......
  • Linux PageCache详解【转】
    转自:https://www.sunliaodong.cn/2021/03/11/Linux-PageCache%E8%AF%A6%E8%A7%A3/应用程序要存储或访问数据时,只需读或者写”文件”的一维地址空间即可,而这个地址空间与存......
  • 路飞前台全局css,全局配置文件、安装axios、安装vue-cookies、安装elementui、安装boot
    目录1路飞前台全局css,全局配置文件1.1整理项目1.2全局css1.3全局js2安装axios3安装vue-cookies4安装elementui6安装bootstrap和jq7后台主页模块表设计8后台主页......
  • Android开发--Intent-filter属性详解
    如果一个Intent请求在一片数据上执行一个动作,Android如何知道哪个应用程序(和组件)能用来响应这个请求呢?IntentFilter就是用来注册Activity、Service和Broadca......