axios 跨域问题_为什么会出现跨域问题

axios 跨域问题_为什么会出现跨域问题什么是跨域首先需要了解到浏览器的同源策略,同源策略是最核心也是最基本的安全功能,缺少同源策略浏览器的正常功能可能会受到影响。同源策略会阻止一个域的javascript脚本和另外一个域的能容进行交互。同源(即指在同一个域)就是两个页面具有相同的协议(protocol)、主机(host)和端口号(port)。当一个请求url的协议、域名、端口三个之间任意一个与当前页面url不同即为跨域。Vue中用Axios解决跨域问题配置代理可解决使用Axios不能直接进行跨域…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

什么是跨域

        首先需要了解到浏览器的同源策略,同源策略是最核心也是最基本的安全功能,缺少同源策略浏览器的正常功能可能会受到影响。同源策略会阻止一个域的javascript脚本和另外一个域的能容进行交互。同源(即指在同一个域)就是两个页面具有相同的协议(protocol)、主机(host)和端口号(port)。

  当一个请求url的协议、域名、端口三个之间任意一个与当前页面url不同即为跨域。

 Vue中用Axios解决跨域问题

   配置代理可解决使用Axios不能直接进行跨域的问题。

        原理:客户端请求服务端的数据存在跨域问题,而服务器和服务器之间可以相互请求数据,没有跨域的概念(前提是服务器没有设置禁止跨域的权限问题),也就是说,可以配置一个代理的服务器请求另一个服务器中的数据,然后把请求出来的数据返回到代理服务器中,代理服务器再返回数据给我们的客户端,如此即可实现跨域访问数据。

axios 跨域问题_为什么会出现跨域问题

 

        步骤一:配置baseURL,(即下面代码段中的 axios.defaults.baseURL = ‘/api/’,作用是我们每次发送的请求都会带一个/api/的前缀。)

        在main.js中,配置数据所在服务器的前缀(即固定部分),代码如下:

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import './plugins/element.js'

import axios from 'axios'

// 配置请求的根路径
axios.defaults.baseURL = '/api/'
// 挂载到原型对象之前 先设置拦截器 通过axios请求拦截器添加token,保证拥有获取数据的权限
axios.interceptors.request.use(config => {
  //在 request 拦截器中, 展示进度条 NProgress.start() 
  NProgress.start()
  // 为请求头对象添加Token验证的Authorization字段
  config.headers.Authorization = window.sessionStorage.getItem('token')
  // 最后都必须 return config
  return config
})
// 在 response 拦截器中, 隐藏进度条 NProgress.done()
axios.interceptors.response.use(config => {
  NProgress.done()
  return config
})
// 原型上挂载axios, 所有组件都可以通过this.$http来请求
Vue.prototype.$http = axios

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

         步骤二:配置代理,(配置在vue.config.js文件中的proxyTable字段中)

dev: {
    proxyTable: {
      '/api/': {
        target:'http://127.0.0.1:8888/api/private/v1/', // 你请求的第三方接口
        changeOrigin:true, /* 在本地会创建一个虚拟服务端,然后发送请求的数据,
        并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题 */
        pathRewrite:{  // 路径重写,
            /* 替换target中的请求地址,也就是说以后你在请求
            http://127.0.0.1:8888/api/private/v1/这个地址的时候直接写成/api/即可。 */
          '^/api/': ''  
        }
      }
    },
  }

        步骤三:具体使用axios的地方,修改为去掉上面设置的前缀之后的url即可

// 获取权限列表
        async getRightsList(){
           const {data:res} = await this.$http.get('rights/list')
           console.log(this.$http.get('rights/lisqt'))
            if(res.meta.status !== 200){
                return this.$message.error('获取权限列表失败!')
            }
            this.rightsList = res.data
            console.log(this.rightsList)
        }
    }

        最后附上一个详细的vue.config.js的配置

module.exports = {
	// 项目部署的基础路径
	// 我们默认你的应用将会部署在域名的根部,比如 https://www.xxx.com/
	// 如果你的应用时部署在一个子路径下,那么你需要在这里指定子路径。
	// 比如,如果你的应用部署在https://www.xxx.com/public/
	// 那么将这个值改为 `/public/`
	// 部署生产环境和开发环境下的URL:可对当前环境进行区分,baseUrl 从 Vue CLI 3.3 起已弃用,要使用publicPath 
	/* baseUrl: process.env.NODE_ENV === 'production' ? './' : '/' */
	publicPath: process.env.NODE_ENV === 'production' ? '/public/' : './',
	/* 输出文件目录:在npm run build时,生成文件的目录名称 */
	outputDir: 'dist',
	/* 放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录 */
    assetsDir: "assets",
    /* 是否在构建生产包时生成 sourceMap 文件,false将提高构建速度 */
    productionSourceMap: false,
    /* 默认情况下,生成的静态资源在它们的文件名中包含了 hash 以便更好的控制缓存,你可以通过将这个选项设为 false 来关闭文件名哈希。(false的时候就是让原来的文件名不改变) */
    filenameHashing: false,
    /* 代码保存时进行eslint检测 */
    lintOnSave: true,
    /* webpack-dev-server 相关配置 */
    devServer: {
        /* 自动打开浏览器 */
        open: true,
        /* 设置为0.0.0.0则所有的地址均能访问 */
        host: '0.0.0.0',
        port: 8066,
        https: false,
        hotOnly: false,
        /* 使用代理 */
        proxy: { // string | Object
            '/api': {
                /* 目标代理服务器地址 */
                target: 'http://xxx/',
                /* 允许跨域 */
                changeOrigin: true,
                pathRewrite: {
                	'^/api': '' //规定请求地址以什么作为开头
            	}
            },
        },
    },
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194715.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 海思hi3798mv300和310的区别_海思3516

    海思hi3798mv300和310的区别_海思3516在网上搜寻海思HI3519或者hi3516实时识别除了官方给的SDK中有Rfcn的实时识别例子之外,其它都是读图片例子。官方例子中给了如下网络参考:Rfcn、Segnet、FasterRcnn、Cnn、Ssd、Yolov1、Yolov2、Yolov3、Lstm、Pvanet在SDK中文件夹路径为/rp-hi3516dv300-busybox/smp/a7_linux/mpp/sample/svp/nnie其中有一个sample_nnie_main.c文件,官方例子如下:/************

    2022年9月23日
    3
  • 俄罗斯方块(C语言实现)

    俄罗斯方块(C语言实现)文章目录游戏说明游戏效果展示游戏代码游戏代码详解游戏框架构建隐藏光标光标跳转初始化界面初始化方块信息颜色设置画出方块空格覆盖合法性判断游戏主体逻辑函数判断得分与结束主函数游戏说明俄罗斯方块相信大家都知道,这里就不再介绍什么游戏背景了,我这里对本代码实现的俄罗斯方块作一些说明:按方向键的左右键可实现方块的左右移动。按方向键的下键可实现方块的加速下落。按空格键可实现方块的顺时针旋转。按Esc键可退出游戏。按S键可暂停游戏,暂停游戏后按任意键继续游戏。按R键可重新开始游戏。除此之外,本游戏还

    2022年5月19日
    44
  • mysql数据库忘记密码时如何修改(本地)「建议收藏」

    mysql数据库忘记密码时如何修改(本地)「建议收藏」mysql数据库忘记密码时如何修改(本地)

    2022年4月24日
    60
  • 程序员如何学习量化交易,一文总结

    程序员如何学习量化交易,一文总结最近有位金融行业的朋友想把一个盈利能力很强的策略做成量化程序遇到问题,问题是这样的线程A在while(true)的循环里做条件判断,循环耗时1分钟。循环结束判断条件满足的时候调用交易接口下单建仓。想实现条件成立马上建仓,而不需要等待1分钟的循环。想通过多进程或者多线程方式,但两个线程不知道如何交互。对有经验的开发来说这样的逻辑很简单,只要通过线程通信的方式就可以实现。A线程判断到满足条件就发个消息给B线程,B线程while(true)等待消息就行。技术本身不复杂,只是没接触过编程的不知道还可以这么干

    2022年6月26日
    34
  • LeetCode——Remove Element

    LeetCode——Remove Element

    2022年2月2日
    42
  • POJ 2996 Help Me with the Game (模拟)

    POJ 2996 Help Me with the Game (模拟)题目链接:http://poj.org/problem?id=2996POJ训练计划中的模拟都是非常棒的模拟,也非常有代表性。这个题讲的是给你一个国际象棋棋盘,敲代码打印出黑白两方的棋子。以及棋子的坐标。可是须要注意的国际棋盘的坐标问题例如以下图这个国际棋盘能够看到数字轴和字母轴的方向以及增减关系。所以在这个题的统计的时候须要进行坐标转换。由于已经做过类似的方法…

    2022年8月12日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号