如何解决 Django 前后端分离开发的跨域问题
一、同源策略
1、先来说说什么是源
• 源(origin)就是协议、域名和端口号。
以上url中的源就是:http://www.company.com:80
若地址里面的协议、域名和端口号均相同则属于同源。
以下是相对于 http://www.a.com/test/index.html 的同源检测
• http://www.a.com/dir/page.html ----成功
• http://www.child.a.com/test/index.html ----失败,域名不同
• https://www.a.com/test/index.html ----失败,协议不同
• http://www.a.com:8080/test/index.html ----失败,端口号不同
2.什么是同源策略?
同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。所以a.com下的js脚本采用ajax读取b.com里面的文件数据是会报错的。
• 不受同源策略限制的:
1、页面中的链接,重定向以及表单提交是不会受到同源策略限制的。
2、跨域资源的引入是可以的。但是js不能读写加载的内容。如嵌入到页面中的<script src="..."></script>,<img>,<link>,<iframe>等。
二、跨域
1、什么是跨域
受前面所讲的浏览器同源策略的影响,不是同源的脚本不能操作其他源下面的对象。想要操作另一个源下的对象是就需要跨域。
2、跨域的几种实现形式
(1)设置document.domain
比如home.example.com要读取developer.example.com里面的文档,由于同源策略的限制,就无法读取,我们通过设置document.domain="example.com";这时就不再受同源策略的限制了。
(2)跨资源共享CORS(Cross-origin
resource sharing)
CORS采用新的“origin:”请求头和新的Access-Control-Allow-Origin响应头来扩展HTTP。它允许服务器用头信息显示地列出源,或使用通配符来匹配所有的源并允许任何地址请求文件。
因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
从而它允许浏览器向跨源服务器,发出XMLHttpRequest请求,克服了AJAX只能同源使用的限制。
(3)跨文档消息(cross-document
messaging)
允许来自一个文档的脚本可以传递消息到另一个文档里的脚本,而不管脚本的来源是否不同,通过调用window.postMessage()方法,可以异步传递消息事件(可以使用onmessage事件处理程序函数来处理它)到窗口的文档里。
3.利用跨资源共享CORS(Cross-origin resource sharing)的Django的跨域操作
(1)将corsheaders注册到你的setting(项目的主配置文件中)
INSTALLED_APPS = [
.....
'corsheaders',
......
]
(2) 在中间件中进行设置
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # 必须在最顶层 ]
注意由中间件的执行顺序,必须要把cors的配置放在顶部
(3)设置进行跨域的ip地址
CORS_ORIGIN_WHITELIST = (
'127.0.0.1:8080',
'localhost:8080',
'127.0.0.1:8080'
)
(4)设置跨域时允许携带cookie
CORS_ALLOW_CREDENTIALS = True # 允许携带cookie
这一步时必须要设置的不然利用Django的obtain_jwt_token验证登陆
(5)设置允许那些主机访问
ALLOWED_HOSTS = ['127.0.0.1']
当然跨域的实现方式有许多,我这里只是使用了其中的一种,如果你还有其他的方案可以在下方留言,欢迎交流
如何解决 Django 前后端分离开发的跨域问题的更多相关文章
- 【坑】前后端分离开发中 跨域问题以及前台不带cookie的问题
文章目录 前言 跨域问题 cookie问题 拦截器导致的跨域问题 后记 前言 场景一: 前台哒哒哒的点击页面,发送请求,但是后台服务器总是没有回应,后台接口虽打了断点,但是根本进不到断点处: 前端:我 ...
- 前后端分离开发,跨域时jsessionid每次请求都变化的问题解决方法
本解决方法的使用前提是,前端开发使用的是vue,后端使用java(SpringMVC) 在前后端分离开发过程中,可能会出现因跨域而导致每次请求的jsessionid不一致的情况 解决方法: 前端:要在 ...
- 前后端分离产生的跨域问题的解决方案之--jsonp、nginx代理、设置头信息等
前言 在前后端没有分离的时候,前端开发要么是写静态页面,数据渲染后端来做,要么就是前端的页面和后端的代码刚开始的时候就合并在一起,每次后端代码更新了之后,前端也要更新一下代码,然后重启一下服务,还是比 ...
- Vue+SpringBoot前后端分离中的跨域问题
在前后端分离开发中,需要前端调用后端api并进行内容显示,如果前后端开发都在一台主机上,则会由于浏览器的同源策略限制,出现跨域问题(协议.域名.端口号不同等),导致不能正常调用api接口,给开发带来不 ...
- 前后端分离 vue+springboot 跨域 session+cookie失效问题
环境: 前端 vue ip地址:192.168.1.205 后端 springboot2.0 ip地址:192.168.1.217 主要开发后端. 问题: 首先登陆成功时将用户存在session ...
- 前后端分离crud(跨域问题)讲解
1 前后端分离 1.1 后端 ssm+maven 多模块 swagger 文档描述(代码拷贝过来,就可以生成了,https://www.cnblogs.com/wings-xh/p/11991511. ...
- 解决vue+springboot前后端分离项目,前端跨域访问sessionID不一致导致的session为null问题
问题: 前端跨域访问后端接口, 在浏览器的安全策略下默认是不携带cookie的, 所以每次请求都开启了一次新的会话. 在后台打印sessionID我们会发现, 每次请求的sessionID都是不同的, ...
- 前后端分离下的跨域CAS请求
最重要的两点: ajax请求跨域的时候,默认不会携带cookie. 请求分为普通请求(HttpRequest)和Ajax请求(XMLHttpRequest) 先屡一下跨域CAS认证的流程: 前端发起a ...
- 如何利用vue和php做前后端分离开发?
新手上路,前端工程师,刚毕业参加工作两个月,上面让我用vue搭建环境和php工程师一起开发,做前后端分离,然而我只用过简单的vue做一些小组件的经验,完全不知道怎样和php工程师配合,ps: php那 ...
随机推荐
- 高级T-SQL进阶系列 (二)【上篇】:使用 APPLY操作符
[译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 伴随着SQL SERVER 2005的发布,微软增加了一个新的操作符,它允许你将一个记录集与一个函数进行关联,然 ...
- 对FPM 模块进行参数优化!
Nginx 的 PHP 解析功能实现如果是交由 FPM 处理的,为了提高 PHP 的处理速度,可对FPM 模块进行参数跳转.FPM 优化参数:pm 使用哪种方式启动 fpm 进程,可以说 static ...
- BIND DNS配置!
1.RPM 包的主要作用bind:提供了域名服务器的主要程序及相关文件bind-utils:提供了对 DNS 服务器的测试工具程序,如 nslookup 等bind-libs:提供了 bind.bin ...
- oracle 基于时间错的 分区表
我们的zabbix 监控使用 oracle 作为存储, 因此,需要创建基于 基于时间戳的分区表,在此将操作过程记录如下 1. 创建,四个zabbix 最大的表的分区表 create table his ...
- 看完这篇微服务架构设计思想,90%的Java程序员都收藏了
本博客强烈推荐: Java电子书高清PDF集合免费下载 https://www.cnblogs.com/yuxiang1/p/12099324.html 微服务 软件架构是一个包含各种组织的系统组织, ...
- 计算机基础 - 时间戳(timestamp)位数
分为10位数字(ten digit)和13位(thirteen digit)数字 1. Unix, Python为10 time +%s import time time.time() 2. Java ...
- Java基础知识笔记第二章:基本数据类型与数组
标识符和关键字 标识符: 1:字母,数字,下划线,美元符号 2.不能以数字开头 3.标识符不能是:true false null(尽管true false null不是java的关键字 ...
- PaperReading20200227
CanChen ggchen@mail.ustc.edu.cn Neural Predictor for Neural Architecture Search Motivation: Curren ...
- python爬虫(二) urlparse和urlsplit函数
urlparse和urlsplit函数: urlparse: url='http://www.baidu.com/s?wd=python&username=abc#1' result=pars ...
- 【PAT甲级】1033 To Fill or Not to Fill (25 分)(贪心,思维可以做出简单解)
题意: 输入四个正数C,DIS,D,N(C<=100,DIS<=50000,D<=20,N<=500),分别代表油箱容积,杭州到目标城市的距离,每升汽油可以行驶的路程,加油站数 ...