Django+vue跨域问题解决的详细步骤


Posted in Javascript onJanuary 20, 2019

跨域

由于开发模式为前后端分离式开发,故而通常情况下,前端和后端可能运行不同的ip或者port下,导致出现跨域问题,故而单独说明

什么是跨域

跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。

其实我们通常所说的跨域是狭义的,是由浏览器同源策略限制的一类请求场景。

什么是同源策略?

同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。

同源策略限制以下几种行为:

  1. Cookie、LocalStorage 和 IndexDB 无法读取
  2. DOM 和 Js对象无法获得
  3. AJAX 请求不能发送

跨域错误浏览器会在控制台中出现如下错误:

报错信息如下:

Access to XMLHttpRequest at ' http://127.0.0.1 :8000/api/test/' from origin ' http://127.0.0.1 :3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

翻译过来即是:从源地址 http://127.0.0.1 :3000 发起的到 http://127.0.0.1 :8000/api/test/ 的XMLHttpRequest访问违反了同源策略:因为在请求头中没有Access-Control-Allow-Origin的值

前端解决跨域

既然跨域是因为不同源,那我同源不就完事儿了,但是后端请求地址不可能改变,所以可以在前端和后端的中间加一层代理,前端通过代理访问后端。

在Vue-cli工具中已经提供了代理的功能,只需要配置即可。

在根目录下的config/index.js文件中有如下配置项:

proxyTable: {
   '/': { 
    target: 'http://127.0.0.1:8000/',
    changeOrigin: true,
    pathRewrite: {
     '^/api': ''
    }
   }
  },
  1. '/'表示以'/'(即所有的路径)开头的路径均需要代理,
  2. target:代理的目标服务器地址(即后端服务器地址)为 ' http://127.0.0.1 :8000/',
  3. changeOrigin,为修改源:修改请求中的源地址
  4. pathReWrite:URL路径重写,对于以'/api'开头的路径将'/api'替换为''

后端解决跨域

后端出于安全考虑,也会对于跨域有限制,解决方法如下:

安装django-cors-headers

$ pip install django-cors-headers

配置settings.py文件

INSTALLED_APPS = [
  ...
  'corsheaders',
  ...
 ] 

MIDDLEWARE_CLASSES = (
  ...
  'corsheaders.middleware.CorsMiddleware',
  'django.middleware.common.CommonMiddleware', # 注意顺序
  ...
)
#跨域增加忽略
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = (
  '*'
)

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',
)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
下载网站打开页面后间隔多少时间才显示下载链接地址的代码
Apr 25 Javascript
基于jquery实现的服务器验证控件的启用和禁用代码
Apr 27 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
Jan 11 Javascript
js的[defer]和[async]属性
Nov 24 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
Dec 08 Javascript
AngularJS入门教程之Helloworld示例
Dec 25 Javascript
老生常谈js中的MVC
Jul 25 Javascript
JS判断两个数组或对象是否相同的方法示例
Feb 28 Javascript
JavaScript箭头函数中的this详解
Jun 19 Javascript
10种JavaScript最常见的错误(小结)
Jun 21 Javascript
vue 路由meta 设置导航隐藏与显示功能的示例代码
Sep 04 Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
Oct 15 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
Jan 20 #Javascript
JavaScript禁用右键单击优缺点分析
Jan 20 #Javascript
JavaScript中concat复制数组方法浅析
Jan 20 #Javascript
JavaScript中import用法总结
Jan 20 #Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 #Javascript
js序列化和反序列化的使用讲解
Jan 19 #Javascript
vue-router传参用法详解
Jan 19 #Javascript
You might like
PHP中MD5函数使用实例代码
2008/06/07 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
2015/12/07 PHP
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
2016/10/13 PHP
Laravel中log无法写入问题的解决
2017/06/17 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
eval的两组性能测试数据
2012/08/17 Javascript
javascipt基础内容--需要注意的细节
2013/04/10 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
node.js入门教程迷你书、node.js入门web应用开发完全示例
2014/04/06 Javascript
分享20个提升网站界面体验的jQuery插件
2014/12/15 Javascript
JavaScript获取URL汇总
2015/06/08 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
浅谈Cookie的生命周期问题
2016/08/02 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
超简单的Vue.js环境搭建教程
2017/03/17 Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
2018/06/25 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
2019/02/13 Javascript
[04:11]DOTA2上海特级锦标赛主赛事首日TOP10
2016/03/03 DOTA
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
python字典的常用操作方法小结
2016/05/16 Python
Python爬虫之xlml解析库(全面了解)
2017/08/08 Python
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
Python+Appium实现自动化清理微信僵尸好友的方法
2021/02/04 Python
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
美国最大的网络男装服装品牌:Bonobos
2017/05/25 全球购物
剪枝的学问教学反思
2014/02/07 职场文书
企业开业庆典答谢词
2015/01/20 职场文书
银行招聘自荐信
2015/03/06 职场文书
拔河比赛队名及霸气口号
2015/12/24 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书