一、原理

同源?同源策略?

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

同源的例子:

不同源的例子:

同源策略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. vim编辑器设置

    由于ubantu自带的vi编辑器并不好用,而开发一般使用vim编辑器,vim需要自己安装(sudo apt-get install vim 即可安装),但是默认的设置使用起来很不舒服,因此可以通过修改 ...

  2. 学习Tomcat(二)之容器概览

    Tomcat容器的Server模块有管理容器的启动和关闭.管理了容器内的服务组件Service.管理了全局JNDI资源的功能,对Tomcat容器的生命周期管理有重要意义.Tomcat的服务组件则是To ...

  3. linq 集合按照多列进行distinct

    List<TaskBatch> sourceList = (from c in BatchCollecion                                         ...

  4. windows中ren(rename-重命名)命令的使用方法

    脚本(*.dat文件): cd /d %~dp0 ren * *.mp3

  5. 记一次 .NET 某上市工业智造 CPU+内存+挂死 三高分析

    一:背景 1. 讲故事 上个月有位朋友加wx告知他的程序有挂死现象,询问如何进一步分析,截图如下: 看这位朋友还是有一定的分析基础,可能玩的少,缺乏一定的分析经验,当我简单分析之后,我发现这个dump ...

  6. Java基础系列(1)- JDK、JRE、JVM

    Java三大版本(Write Once:Run Anywhere) JavaSE:标准版 JavaME:嵌入式开发 JavaEE:E企业级开发 JDK.JRE.JVM JDK是开发工具包 JRE是编译 ...

  7. php 设计模式 --适配器

    1,目标:实现一个不同的类不同方法,符合一定的规范: 规范类 <?php interface Iplay{ function Attack(); function Defence(); } cl ...

  8. find_elements与find_element的区别

    find_element不能使用len,find_elements可以使用len获取元素数量,判断页面有无某个元素,这个方法可以用来断言. 如添加用户后,判断是否添加成功. 删除用户后,判断是否删除成 ...

  9. 一篇文章搞定Selenium元素定位/封装/数据驱动

    小伙伴都知道,自动化最重的,又最"难"(因为实战中会碰到定位的各种坑)那就是定位元素.如果不熟练掌握定位,那只怕你比功能测式的小伙伴下班还会要晚!扎心了吧! Selenium常用定 ...

  10. 2017第二届广东省强网杯线上赛:WEB phone number (SQL注入)

    目录 解题思路 总结 解题思路 拿到题目的时候,只有一个登录界面 拿到登录界面,而且还伴随着有注册界面,联想到SQL的二次注入漏洞 尝试注册admin'#,并使用admin登录,发现登录失败,说明可能 ...