前后端分离开发跨域问题总结

news2025/1/2 3:14:44

在这里插入图片描述

前后端分离开发跨域问题总结

    • 一、什么是跨域访问
    • 二、解决跨域问题
      • 1、Vue前端配置代理解决跨域
      • 2、SpringBoot后端配置解决跨域
        • 2.1 跨域配置类`CorsConfig`(常用)
        • 2.2 Controller添加`@CrossOrigin`注解
        • 2.3 添加CORS过滤器`CorsFilter`(常用)
        • 2.4 使用SpringSecurity来解决跨域问题

开发需求:
在使用vue uniapp springboot开发微信小程序过程中,也是采用了前后端分离的模式,前端页面及js部署在微信小程序中,后端接口部署在阿里云服务器中,当前端向后端发起请求的时候一定是不符合同源策略的,也就无法访问,就会需要解决跨域问题,实现前后交互。本文系统介绍了跨域问题为什么会出现,以及所有的处理方式。

一、什么是跨域访问

跨域访问,必须先了解一个名词:同源策略

同源策略是指在浏览器端出于安全考量,向服务端发起请求必须满足:协议相同、Host(ip)相同、端口相同的条件,否则访问将被禁止,不满足要求的访问也就被称为跨域访问。

虽然跨域访问被禁止之后,可以在一定程度上提高了应用的安全性,但也为开发带来了一定的麻烦。

跨域,指的是浏览器不能执行其他网站的脚本,是浏览器对JavaScript施加的安全限制。

所谓同源是指:域名、协议、端口均相同,例子如下:

http://www.jumper.com/index.html 调用 http://www.jumper.com/server.PHP (非跨域)

http://www.jumper.com/index.html 调用 http://www.sun.com/server.php (主域名不同:jumper/sun,跨域)

http://abc.jumper.com/index.html 调用 http://def.jumper.com/server.php(子域名不同:abc/def,跨域)

http://www.jumper.com:8080/index.html调用 http://www.jumper.com:8081/server.php(端口不同:8080/8081,跨域)

http://www.jumper.com/index.html 调用 https://www.jumper.com/server.php(协议不同:http/https,跨域)

请注意:localhost 和127.0.0.1虽然都指向本机,但也属于跨域。

二、解决跨域问题

下文是解决跨域问题两种方式:前端、后端,其中后端又包括的方法,用一种即可,无需全部配置使用。

1、Vue前端配置代理解决跨域

​ 在Vue中解决跨域问题比较简单,因为我们每次浏览器发送的请求中,URL的前半部分一定是相同的,比如http://localhost:8080/users与http://localhost:8080/login,我们就可以将他们相同的URL提取出来,封装到axios.defaults.baseURL中,这样我们在每次请求的时候,就可以将请求地址简写成“/users”这样,相当于是将URL头部进行了一个简单的封装。
request.js

import axios from 'axios'

const request = axios.create({
	baseURL: '/api',  // 这里是全局统一加上了 '/api' 前缀,也就是说所有接口都会加上'/api'前缀在,其他位置写接口的时候就不要加 '/api'了,否则会出现两个'/api',类似 '/api/api/user'这样的报错,切记!!!
    timeout: 5000
})

// request 拦截器 可以自请求发送前对请求做一些处理
// 比如统一加token,对请求参数统一加密
request.interceptors.request.use(config => {
    config.headers['Content-Type'] = 'application/json;charset=utf-8';
  
 // config.headers['token'] = user.token;  // 设置请求头
    return config
}, error => {
    return Promise.reject(error)
});

// response 拦截器 可以在接口响应后统一处理结果
request.interceptors.response.use(
    response => {
        let res = response.data;
        // 如果是返回的文件
        if (response.config.responseType === 'blob') {
            return res
        }
        // 兼容服务端返回的字符串数据
        if (typeof res === 'string') {
            res = res ? JSON.parse(res) : res
        }
        return res;
    },
    error => {
        console.log('err' + error) // for debug
        return Promise.reject(error)
    }
)


export default request

vue.config.js

module.exports = {
    devServer: {
        host: 'localhost',
        open: true, // 自动打开浏览器
        // 代理配置表,在这里可以配置特定的请求代理到对应的API接口
        proxy: {
            '/api': { // 匹配所有以 '/api'开头的请求路径
                target: 'http://localhost:8080', // 代理目标的基础路径
                // secure: false,   // 如果是https接口,需要配置这个参数
                changeOrigin: true, // 支持跨域
                pathRewrite: { 	    // 重写路径: 去掉路径中开头的'/api'
                    '^/api': ''
                }
            }
        }
    }
}

2、SpringBoot后端配置解决跨域

2.1 跨域配置类CorsConfig(常用)

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOriginPatterns("*")
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                .allowCredentials(true)
                .maxAge(3600)
                .allowedHeaders("*");

    }
}

2.2 Controller添加@CrossOrigin注解

@RestController
@RequestMapping("users/")
public class IndexController {

    @GetMapping
    @CrossOrigin
    public String users() {
        return "users";
    }
}

2.3 添加CORS过滤器CorsFilter(常用)

新建配置类CorsFilterConfig,创建CorsFilter过滤器,允许跨域

@Configuration
public class CorsConfig {
    // 跨域请求处理
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        //允许所有域名进行跨域调用
        config.addAllowedOrigin("*");
        // config.addAllowedOrigin("http://localhost:8080");
            
        //允许所有请求头
        config.addAllowedHeader("*");
        //允许所有方法
        config.addAllowedMethod("*");
        // 为url添加映射路径
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        
        return new CorsFilter(source);
    }
}

2.4 使用SpringSecurity来解决跨域问题

public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .and().cors().configurationSource(corsConfigurationSource())
                .and()
                .csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());//将csrf令牌存储在cookie中 允许cookie前端获取
    }

    CorsConfigurationSource corsConfigurationSource(){
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedHeaders(Arrays.asList("*"));
        config.setAllowedMethods(Arrays.asList("*"));
        config.setAllowedOrigins(Arrays.asList("*"));
        config.setMaxAge(3600L);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return source;
    }
  }

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

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

相关文章

selenium之鼠标操作

首先导入ActionChains类,该类可以完成鼠标移动,鼠标点击事件,键盘输入、内容菜单交互等交互行为。 from selenium.webdriver.common.action_chains import ActionChains 操作语法: 第一步:初始化ActionChains类&…

系列二、Maven下载安装配置

一、下载 链接:https://pan.baidu.com/s/1BvwLzAk9kRSP-daxSYe4Vw?pwdyyds 提取码:yyds 二、安装 第一步:下载安装包 第二步:解压至安装目录,例如 第三步:配置settings.xml(主要配置maven本…

Open ai 开发指南:gpt接口的第一个问答机器人demo

目录 内容 Python代码 C 代码 workspace 文件 BUILD文件 Java 代码 maven文件 执行效果 内容 基于openai接口实现循环gpt问答,并使用一个文件将问答内容进行记录。 Python代码 # -*- coding: utf-8 -*- import openai import time from pathlib import P…

100天精通Python(可视化篇)——第93天:Pyecharts绘制多种炫酷饼图参数说明+代码实战(百分比、环形、玫瑰、内嵌、多个子图饼图)

文章目录 专栏导读1. 基础饼图add函数简单案例改变颜色 2. 百分比饼图3. 环形饼图4. 玫瑰饼图5. 内嵌环图6. 多个饼图 专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整…

学习前端开发,能抛弃HTML和CSS吗?

前言 前端开发里面HTML和CSS是两个非常重要的核心技术,它们是构建网页和应用程序界面的基础。 HTML(超文本标记语言)是用于描述网页结构的标记语言,它定义了网页的内容、布局和元素。几乎所有的网页都使用HTML来组织和呈现内容&…

5.6.3 套接字

5.6.3 套接字 我们先以示例引入套接字的基本内容,我们知道在邮政通信的时候我们需要在信封上写明我们的收件地址,比如北京市海淀区双清路30号清华大学8444号某某某收,这其中我们需要一个物理地址“北京市海淀区双清路30号”,一个…

SpringBoot 如何使用 Ehcache 作为缓存?

SpringBoot 如何使用 Ehcache 作为缓存? 在现代的应用程序中,缓存是一个非常重要的概念。缓存可以帮助我们加速应用程序的响应时间,减少数据库或其他服务的负载,并提高系统的可扩展性和容错性。Spring Framework 提供了强大的缓存…

Linux下的su指令和last指令

文章目录 1 切换用户命令(su)2 查看本机的所有登录记录(last)3 退出当前登录账户(exit) 1 切换用户命令(su) su 命令可以切换成不同的用户身份,命令格式如下&#xff1a…

【文本SR:轻量级:残差注意力】

A Lightweight Deep Residual Attention Network for Single Image Super Resolution (一种用于单幅图像超分辨率的轻量级深度残差注意力网络) 本文将稀疏编码技术应用于基于学习的文本图像超分辨率(SR)中,以提高光学…

浅析做好数据安全风险评估的重要性

一、被忽略的数据安全风险 快速问答 你知道公司内有多少数据资产吗? 这些数据资产中哪些数据更为重要? 如何保护公司数据资产,防止数据泄露&劫持等事件发生? 如果你一问三不知的话,也许你该好好思考数据安全这项…

数据库系统概论(三)数据库设计、数据库恢复技术、并发控制

作者的话 前言:总结下知识点,自己偶尔看一看。 一、数据库设计 数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统 1.1概述 1.1.1数据库设计…

mysql 简单定位慢查询并分析SQL执行效率

实际的日常开发工作中可能会遇到某个新功能在测试时需要很久才返回结果,这时就应该分析是不是慢查询导致的,如果确实有慢查询,就需要来学习怎么找到慢查询和怎么分析 SQL 执行效率? 定位慢 SQL 有如下两种解决方案: …

ClickHouse-简单了解

文章目录 前言数据库引擎数据表引擎Log 系列Integration 系列Special 系列MergeTree 系列 ClickHouse 数据类型ClickHouse 常用的函数 前言 什么是 ClickHouse?简单来说它是一个高性能,面向列的SQL数据库管理系统(DBMS)&#xff…

嵌入式知识分享——GDB程序调试方法说明

前 言 本指导文档适用开发环境: Windows开发环境:Windows 7 64bit、Windows 10 64bit Linux开发环境:Ubuntu 18.04.4 64bit 虚拟机:VMware15.1.0 U-Boot:U-Boot-2020.04 Kernel:Linux-5.4.70 Linux…

接口调用重放测试-业务安全测试实操(21)

接口调用重放测试。 接口调用遍历测试 接口调用重放测试 测试原理和方法 在短信、邮件调用业务或生成业务数据环节中,如短信验证码、邮件验证码、订单生成、评论提交等,对业务环节进行调用(重放) 测试。如果业务经过调用(重放) 后多次生成有效的业务或数据结果,可判断为存在…

PMP®证书增持 CSPM-2证书,哪里办理?

2023年6月起,持有PMP证书的朋友可以直接增持一个同等级证书CSPM-2,不用重新考试,不用重新学习,原PMP证书不影响正常使用,相当于多了一个国标项目管理领域的证书。 第一步准备资料 1、填写能力评价表 2、提供2张2寸蓝底…

在 Jetson Nano 上安装 ncnn 深度学习框架。

Install ncnn deep learning framework on a Jetson Nano. Introduction.RTTI.CMake 3.18.4.Dependencies.Benchmark.Introduction. 本页面将指导您在 Jetson Nano 上安装腾讯的 ncnn 框架。由于 ncnn 框架面向移动设备(例如 Android 手机),因此它不支持 CUDA。然而,大多数…

考虑储能的电价套利收益模型研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

C语言笔记-1 编译过程字节数

文章目录 C 基础语法注意 C 其他知识点编译过程编译器数据模型区别32/64位机器中,各数据类型所占位数assert() 断言(宏)用法总结与注意事项 C 基础语法 注意 if(a表达式) 判断的就是a的值,而不是判断这个赋值操作的成功与否。 查…

项目经理告诉你,项目管理的基本原则

张伟初升为项目经理,正面临着职业生涯中的挑战。他意识到项目经理的责任是复杂而艰巨的,因此在工作中经常犯错。他发现自己的表达不够清晰,思维混乱;花费大量时间制作的文字记录重点不突出,缺乏逻辑。这些问题破坏了他…