一、原理

同源?同源策略?

的定义是:两个页面的协议、端口和域名都相同

同源的例子:

不同源的例子:

同源策略SOP(Same origin policy)是一种浏览器约定,它是浏览器最核心也最基本的安全功能,为了防止浏览器受到XSS、CSFR的攻击,浏览器采用了同源策略,用于限制一个源加载的文档或脚本与另一个源的交互。

在我们的项目中,前端的vue和后端的django分别使用不同的端口,因此受到同源策略的限制,在没有跨域配置的初期,无法进行正常通信。

跨域?什么域?

跨域顾名思义就是一个网域向另一个网域发起资源交互,比如我们的前端http://localhost:9528与后端http://127.0.0.1:8000由于端口号的不同,处在不同的网域(源),因此进行api请求获取资源自然就是违反同源策略的跨域操作。

后端端口:

前端端口:

二、使用CORS解决跨域问题

跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 源 (网域) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求

Django CORS

1)安装django-cors-headers模块

pip install django-cors-headers

2) 在settings.py中配置

  • 添加应用
INSTALLED_APPS = [
...
'corsheaders',
...
]
  • 添加中间件
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
...
]
  • 添加白名单并允许访问白名单
CORS_ORIGIN_WHITELIST = (
'http://127.0.0.1:8000',
'http://localhost:9528', #凡是出现在白名单中的域名,都可以访问后端接口
) CORS_ALLOW_CREDENTIALS = True # 允许携带cookie

Vue Proxy

vue.config.js中配置proxy代理

devServer: {
...
proxy: {
'^/api': {
target: 'http://127.0.0.1:8000',
changeOrigin: true, // 允许跨域
pathRewriter: {
'^/api' : ''
}
}
},
...
},

其中,^/api表示以"/api"开头的url将会代理到target对应的网域中,pathRewriter表示将url中的"/api"改写为"",也就是删去。

三、踩坑/经验

  1. 在vue.config.js里配置proxy,并修改请求的url后仍无法连接到后端

    • 解决:

      • url最后忘了'/',导致和后端不匹配,会有404、500等错误
      • 后端服务未打开或出现其他错误,也会报code为500的错
      • api中添加request,记得修改urlbaseURL(比如我们使用vue-element-admin,默认是/dev-api,改成空),否则在请求的url中间会多一个/dev-api,取不到数据
      • proxy中的拼写错误也会导致无法处理跨域,比如"pathRewriter"写成"pathRewrite"
  2. 在后来实验中,发现Django的CORS和Vue的proxy只需配置其一,就能实现跨域资源共享

四、参考

Django+Vue跨域配置与经验的更多相关文章

  1. django 的跨域配置

    1.跨域原理 #1. 首先浏览器安全策略限制js ajax跨域访问服务器 #2. 如果服务器返回的头部信息中有当前域: // 允许 http://localhost:8080 这个网站打开的页面中的j ...

  2. vue 跨域配置代理 get/post 请求

    1.第一步要有 axios 插件 : npm i axios 首先要在自己的项目手动添加一个文件 vue.config.js 个人理解的为 这是axios 封装的跨域文件. 2.vue.config. ...

  3. Django 处理跨域的配置、前台处理ajax

    一. Django处理跨域 跨域的处理方式有很多,使用最多的就是CORS(跨域资源共享),接下来大致提一下django中处理跨域的配置. 首先安装django-cors-headers模块: pip ...

  4. django允许跨域请求配置

    django允许跨域请求配置 下载corsheader pip install django-cors-headers 修改setting.py中配置 在INSTALLED_APPS中增加corshe ...

  5. vue跨域问题解决(生产环境)

    vue跨域问题解决(使用webpack打包的) 配置代理:(config下index.js文件) module.exports = { dev: { env: require('./dev.env') ...

  6. nginx-springboot-vue前后端分离跨域配置

    nginx-springboot-vue前后端分离跨域配置 引言 接着上篇--简单的springboot-vue前后端分离登录Session拦截的demo,其中跨域是通过springboot后端全局设 ...

  7. vue跨域处理

    本人对于vue跨域处理流程不是很清楚,特此理顺一遍. 1.在config中进行配置,该文件不是都存在,需要自己建: proxyTable,这个参数主要是一个地址映射表,你可以通过设置将复杂的url简化 ...

  8. vue 跨域 springCloud @CrossOrigin注解

    vue 跨域  springCloud @CrossOrigin注解 一丶什么是跨域 跨域问题来源于浏览器的同源策略,浏览器为了提高网站的安全性,在发送ajax请求时,只有在当前页面地址与请求地址的协 ...

  9. [转]vue跨域解决方法

      vue跨域解决方法 vue项目中,前端与后台进行数据请求或者提交的时候,如果后台没有设置跨域,前端本地调试代码的时候就会报“No 'Access-Control-Allow-Origin' hea ...

随机推荐

  1. Git 系列教程(6)- 查看 commit 提交历史

    查看提交历史 在提交了若干更新,又或者克隆了某个项目之后,如何查看提交历史 git log 官方栗子 运行下面的命令获取该项目: git clone https://github.com/scha 运 ...

  2. mybatis和hibernate区别

    一.本质区别和应用场景

  3. python中字典按键、值进行排序

    看到排序,就不禁想起python中的sort和sorted sort是列表中的方法,用于对列表进行排序(改变的是原列表,不返回新列表) 用法: list.sort(key=None,reverse=T ...

  4. ECDSA—模逆模块

    在有限域Fp上的非零元素a的逆记为a-1mod p .即在有限域Fp上存在唯一的一个元素x,使得ax恒等于1(mod p),则元素x为a的逆a-1 .本次设计采用扩展的整数Euclidean算法来求逆 ...

  5. Grid 网格布局详解

    Grid网格布局详解: Grid布局与Flex布局有着一定的相似性,Grid布局是将容器划分成行和列,产生单元格,可以看做是二维布局. 基本概念: 采用网格布局的区域,称为"容器" ...

  6. SpringBoot 如何进行对象复制,老鸟们都这么玩的!

    大家好,我是飘渺. 今天带来SpringBoot老鸟系列的第四篇,来聊聊在日常开发中如何优雅的实现对象复制. 首先我们看看为什么需要对象复制? 为什么需要对象复制 如上,是我们平时开发中最常见的三层M ...

  7. Java基础系列(38)- 数组的使用

    数组的使用 For-Each循环 数组作方法入参 数组作返回值 For-Each循环 普通型 package array; import sun.security.util.Length; publi ...

  8. vue.js 配置axios 用来ajax请求数据

    * 用npm 安装 axios 切换到项目的根目录 npm install --save axios vue-axios * 在vue的入口文件./src/main.js 中引入axios, 添加2行 ...

  9. 制作python程序windows安装包(飞机大战源码)

    本文以飞机大战源码为例: 1.首先使用pyinstaller -w xxx.py打包   -w的意思是不显示命令行:飞机大战源码由多个.py文件以及一些图片,音乐文件组成,我们将main.py打包, ...

  10. 对代理IP进行检测是否可用

    第一种方法是使用telnetlib import telnetlib import requests from lxml import etree #解析此url页面的IP url = 'http:/ ...