【Vue】vue2与WebApi跨域CORS问题

news2024/11/25 19:23:08

系列文章

C#底层库–记录日志帮助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124187709

文章目录

  • 系列文章
  • 前言
  • 一、技术介绍
    • 1.1 为什么会产生跨越
    • 1.2 什么是跨越
  • 二、问题描述
  • 三、问题解决
    • 3.1 方法一:前端Vue修改
    • 3.2 方法二:后端允许Cors跨越访问
  • 四、资源链接


前言

本专栏为【前端】,主要介绍前端知识点。
在这里插入图片描述

一、技术介绍

1.1 为什么会产生跨越

出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的。

1.2 什么是跨越

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

二、问题描述

我这里是vue前端采用axios通信(使用vue+element+admin框架,通信交互使用request.js,归根到底还是对axios通信的封装)。
axios通信需要自己解决跨越,现在ajax的封装已经不需要考虑跨越问题了,底层已经处理好了。
跨域的报错信息,具体如下:
在这里插入图片描述

三、问题解决

3.1 方法一:前端Vue修改

配置代理转发,将URL转换成新的URL。
操作步骤:vue.config.js文件,加以下代码:

 devServer: {
    // host: 'localhost', // 服务器 host,默认为 localhost
    port: 18888,
    open: false, // string | boolean,启动后是否打开浏览器,当为字符串时,打开指定浏览器
    overlay: { // 设置编译出错或警告后,页面是否会直接显示信息
      warnings: false,
      errors: true
    },
    proxy: {
      // 路由代理
      '/prod-api': {
        target: PLATFROM_CONFIG.PLATFROM_CONFIG.baseURL,
        changeOrigin: true, // 如果接口跨域,需要进行这个参数配置
        pathRewrite:{ 
          '^/prod-api':'' // 重写请求,接口是/api/doc变为/doc
        }
      },
      '/dev-api': {
        target: PLATFROM_CONFIG.PLATFROM_CONFIG.baseURL,
        changeOrigin: true, // 如果接口跨域,需要进行这个参数配置
        pathRewrite:{ 
          '^/dev-api':'' // 重写请求,接口是/api/doc变为/doc
        }
      },
      '/api': {
        target: "http://192.168.6.6:19999",
        changeOrigin: true // 如果接口跨域,需要进行这个参数配置
      }
    }
  },

/api取决于你定义的格式是什么样的,具体可以看一下 .env.development.env.production 文件。
在这里插入图片描述
我这里开发模式,URL头使用/dev-api,那就对它做代理转发。
在这里插入图片描述
/api那个我是用于,文件上传、下载的转发的,文件上传比较特殊使用action
在这里插入图片描述

3.2 方法二:后端允许Cors跨越访问

①官方原生的net core webapi
Program.cs文件

//配置跨域
builder.Services.AddCors(c =>
{
    c.AddDefaultPolicy(policy =>
    {
        policy.AllowAnyOrigin()//允许所有来源的访问
        .AllowAnyHeader()//允许所有类型的请求头
        .AllowAnyMethod();//允许所有类型的请求
    });
});

启动跨越,在run之前

app.UseCors();
app.UseHttpsRedirection();

②采用服务注入的net core webapi

创建类SetupCors.cs

using YS.Common;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using System;

namespace YS.WebApi.Extensions
{

    public static class SetupCors
    {
        public static void AddCorsSetup(this IServiceCollection services)
        {
            if (services == null) throw new ArgumentNullException(nameof(services));

            services.AddCors(options =>
            {
                options.AddPolicy("LimitRequests", policy =>
                {
                    //policy.WithOrigins(AppSettings.Configuration["Startup:AllowOrigins"].Split('|'))
                    policy.AllowAnyOrigin()//允许所有来源的访问
                    .AllowAnyHeader()//允许所有类型的请求头
                    .AllowAnyMethod();//允许所有类型的请求
                });
            });
        }

        public static void UseCorsSetup(this IApplicationBuilder app)
        {
            app.UseCors("LimitRequests");
        }
    }
}

服务注入使用跨越

 //跨域设置
 services.AddCorsSetup();

四、资源链接

vue.config.js文件

'use strict'
const path = require('path')
const defaultSettings = require('./src/settings.js')
const PLATFROM_CONFIG = require('./public/config')

function resolve(dir) {
  return path.join(__dirname, dir)
}

const name = defaultSettings.title // 网址标题
const port = process.env.port || 18888 // 端口配置

// webpack.dev.js devServer 配置
module.exports = {
  publicPath: '/', // 公共路径
  outputDir: 'dist',
  assetsDir: 'static',
  lintOnSave: process.env.NODE_ENV === 'development',
  productionSourceMap: false,
  devServer: {
    // host: 'localhost', // 服务器 host,默认为 localhost
    port: 18888,
    open: false, // string | boolean,启动后是否打开浏览器,当为字符串时,打开指定浏览器
    overlay: { // 设置编译出错或警告后,页面是否会直接显示信息
      warnings: false,
      errors: true
    },
    proxy: {
      // 路由代理
      '/prod-api': {
        target: PLATFROM_CONFIG.PLATFROM_CONFIG.baseURL,
        changeOrigin: true, // 如果接口跨域,需要进行这个参数配置
        pathRewrite:{ 
          '^/prod-api':'' // 重写请求,接口是/api/doc变为/doc
        }
      },
      '/dev-api': {
        target: PLATFROM_CONFIG.PLATFROM_CONFIG.baseURL,
        changeOrigin: true, // 如果接口跨域,需要进行这个参数配置
        pathRewrite:{ 
          '^/dev-api':'' // 重写请求,接口是/api/doc变为/doc
        }
      },
      '/api': {
        target: "http://192.168.6.6:19999",
        changeOrigin: true // 如果接口跨域,需要进行这个参数配置
      }
    }
  },
  configureWebpack: {
    // provide the app's title in webpack's name field, so that
    // it can be accessed in index.html to inject the correct title.
    name: name,
    resolve: {
      alias: {
        '@': resolve('src')
        }
    },
    performance: {
      maxEntrypointSize: 10000000,
      maxAssetSize: 30000000
    }
  },
  chainWebpack(config) {
    // it can improve the speed of the first screen, it is recommended to turn on preload
    config.plugin('preload').tap(() => [
      {
        rel: 'preload',
        // to ignore runtime.js
        // https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/cli-service/lib/config/app.js#L171
        fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/],
        include: 'initial'
      }
    ])

    // when there are many pages, it will cause too many meaningless requests
    config.plugins.delete('prefetch')

    // set svg-sprite-loader
    config.module
      .rule('svg')
      .exclude.add(resolve('src/assets/icons'))
      .end()
    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(resolve('src/assets/icons'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })
      .end()

    // set preserveWhitespace
    config.module
      .rule('vue')
      .use('vue-loader')
      .loader('vue-loader')
      .tap(options => {
        options.compilerOptions.preserveWhitespace = true
        return options
      })
      .end()

    config
      // https://webpack.js.org/configuration/devtool/#development
      .when(process.env.NODE_ENV === 'development',
        config => config.devtool('cheap-source-map')
      )

    config
      .when(process.env.NODE_ENV !== 'development',
        config => {
          config
            .plugin('ScriptExtHtmlWebpackPlugin')
            .after('html')
            .use('script-ext-html-webpack-plugin', [{
              // `runtime` must same as runtimeChunk name. default is `runtime`
              inline: /runtime\..*\.js$/
            }])
            .end()
          config
            .optimization.splitChunks({
              chunks: 'all',
              cacheGroups: {
                libs: {
                  name: 'chunk-libs',
                  test: /[\\/]node_modules[\\/]/,
                  priority: 10,
                  chunks: 'initial' // only package third parties that are initially dependent
                },
                elementUI: {
                  name: 'chunk-elementUI', // split elementUI into a single package
                  priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
                  test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
                },
                commons: {
                  name: 'chunk-commons',
                  test: resolve('src/components'), // can customize your rules
                  minChunks: 3, //  minimum common number
                  priority: 5,
                  reuseExistingChunk: true
                }
              }
            })
          config.optimization.runtimeChunk('single')
        }
      )
  },
  transpileDependencies: [
    'vue-echarts',
    'resize-detector'
  ]
}


Program.cs文件

using System.Configuration;
using WebApplication5;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

//配置跨域
builder.Services.AddCors(c =>
{
    c.AddDefaultPolicy(policy =>
    {
        policy.AllowAnyOrigin()//允许所有来源的访问
        .AllowAnyHeader()//允许所有类型的请求头
        .AllowAnyMethod();//允许所有类型的请求
    });
});

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();


var app = builder.Build();

app.UseCors();
app.UseHttpsRedirection();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1101364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

喜报!震坤行荣登“2023上海百强企业”两项百强榜单!

喜报!震坤行荣登“2023上海百强企业”两项百强榜单! 9月12日,上海市企业联合会、上海市企业家协会、上海市经济团体联合会和解放日报社在中国金融信息中心会议厅联合召开2023上海百强企业新闻发布会,上海市企业联合会会长刘家平主…

信号完整性分析基础知识之有损传输线、上升时间衰减和材料特性(六):衰减和dB

线路中的损耗对信号的主要影响是当信号沿线路长度传播时幅度减小。如果将幅度为 V 的正弦波电压信号引入传输线,则其幅度将随着传输线向下移动而下降。图 9-16 显示了如果我们可以冻结时间并观察直线上存在的正弦波,则正弦波在不同位置可能会是什么样子。…

如何让你的桌面干净得像一张白纸(详细教程)

文章目录 固定到任务栏固定到快速访问固定到“开始”屏幕添加桌面右键菜单最终效果展示程序员专属工具箱 ✍创作者:全栈弄潮儿 🏡 个人主页: 全栈弄潮儿的个人主页 🏙️ 个人社区,欢迎你的加入:全栈弄潮儿的…

AQS原理及源码解析

概要 AQS是AbstractQueuedSynchronizer类的简称,为了方便,后面都以AQS来指代。AQS通过对互斥锁、共享锁和条件等待的基础实现和封装,同时为juc包下其他类提供扩展,完善了java体系的锁、线程池和并发集合类的实现,主要包…

确保第三方 API 安全的 5 个最佳实践

应用程序编程接口 (API) 已成为设置功能和灵活性不可或缺的一部分。但它们也是潜在的攻击媒介,需要在安全团队的雷达上占据很高的位置。 当组织考虑应用程序编程接口 (API) 安全性时,他们通常专注于保护内部…

AssetBundle的正确加载

需求描述 在加载一个AssetBundle资源包(后续简称AB包)的时候我们还需要考虑其对应的依赖,所以加载AssetBundle资源包并非总是简单地调用相关的加载API即可,缺乏依赖那么AssetBundle资源包中的资源就无法正常加载或使用。 通过Asse…

Ubuntu防火墙设置

查看当前防火墙状态 设定信息端口号为12345的访问 sudo ufw allow 12345

自动化测试有必要学吗?一篇从功能测试进阶到自动化测试...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 问题:…

vue视频直接播放rtsp流;vue视频延迟问题解决;webRTC占cpu太大卡死问题解决

播放多个视频 <div class"video-box"><div class"video"><iframe style"width:100%;height:100%;" name"ddddd" id"iframes" scrolling"auto" :src"videoLeftUrl"></iframe>&l…

【分享】国产AI工具大整理,都是好东西(赶紧看 待会儿删)

哈喽&#xff0c;大家好&#xff0c;我是木易巷~ 我认同一个观点&#xff0c;那就是未来的世界将会只存在两种人&#xff1a;会使用AI的人和不会使用AI的人。相信许多人已经开始感受到了“AI焦虑”&#xff0c;担心自己的技能将被AI超越。然而&#xff0c;我认为AI并不是人类的…

Linux进阶-ipc消息队列

目录 system-V IPC 消息队列 消息队列和信号管道的对比 消息队列和信号的对比 消息队列和管道的对比 消息队列函数API msgget()&#xff1a;打开或创建消息队列 msgsnd()&#xff1a;发送消息 msgrcv()&#xff1a;接收消息 msgctl()&#xff1a;控制消息队列 msgsn…

移动互联网客户端可能没什么路可走了.......

2010~2020可以算移动客户端的黄金十年了&#xff0c;微信、淘宝、抖音等国民级应用都诞生于这十年间&#xff0c;也顺带产生了不少技术上的黑科技&#xff08;比如动态化、跨平台、热修复&#xff09;。 然而现在头部公司的稳定&#xff0c;App独立生存的空间被不断挤压&#…

el-menu页面离开弹窗,当前激活菜单的高亮问题

问题描述 在A页面监控路由离开&#xff0c;&#xff0c;弹出弹窗后提示未保存点击取消&#xff0c;此时左侧的菜单激活是B高亮&#xff0c;正常应该是激活A菜单。 1&#xff0c;A页面页面离开的弹窗&#xff0c;在A页面弹窗点击取消 ##解决方法 1.在菜单组件增事件&#xf…

75.C++ STL queue容器

目录 1.什么是queue容器 2.queue的构造函数 3.存取、插入、删除操作 4.赋值操作 5.大小操作 以下是一个简单示例&#xff0c;演示如何使用 queue&#xff1a; 1.什么是queue容器 queue 是 C 标准库提供的队列容器&#xff0c;它是一个容器适配器&#xff0c;用于管理遵循…

如何管理前端状态?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

如何清理内存空间?几步操作轻松搞定!

电脑内存的清理是维护系统性能的重要步骤之一。如果电脑内存不足&#xff0c;可能会导致电脑运行卡顿、无法存入文件等各种问题。及时清理电脑内存非常重要。怎样清理电脑内存呢&#xff1f;怎么才能更高效的释放更多电脑内存呢&#xff1f;下面是三个常用的方法。 一、关闭不必…

实施03(文件夹共享和网络配置)

远程连接&#xff08;防火墙设置&#xff09;把远程端口打开新建规则 选择端口后&#xff0c;选择TCP&#xff0c;选择特定本地端口&#xff0c;输入我们需要开放的端口号下一步选择允许连接回车给开放的端口号取个名称回车就可以了 实现文件夹共享首先在任意盘符新建一个文件夹…

工控网络协议模糊测试:用peach对modbus协议进行模糊测试

0x00 背景 本人第一次在FB发帖&#xff0c;进入工控安全行业时间不算很长&#xff0c;可能对模糊测试见解出现偏差&#xff0c;请见谅。 在接触工控安全这一段时间内&#xff0c;对于挖掘工控设备的漏洞&#xff0c;必须对工控各种协议有一定的了解&#xff0c;然后对工控协议…

攀岩绳上亚马逊合规认证EN892测试标准

攀岩绳 攀岩绳是与攀岩安全带和锚点相连的一种装备&#xff0c;用于保护攀岩者&#xff0c;使其不会从高处跌落。攀岩绳由承重内芯和围绕内芯编织的护套组成。 亚马逊关于攀岩绳的政策 根据亚马逊的要求&#xff0c;所有攀岩绳均应经过检测&#xff0c;并且符合下列特定法规或…

Go语言Gin框架中使用MySQL数据库的三种方式

文章目录 原生SQL操作XORMGORM 本文演示在Gin框架中通过三种方式实现增删改查的操作&#xff0c;数据表结构如下&#xff1a; CREATE TABLE users (id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT ID,user_no bigint(20) unsigned NOT NULL COMMENT 用户编号,name varch…