解决跨域问题的两种方案

news2024/9/21 20:52:57

说明:跨域是指,在A向B发送请求时,如果A和B的协议、端口号和域名有一个不相同。跨域问题是指,浏览器出于安全,会阻止跨域的异步请求(如Ajax),而在分布式的开发环境下,跨域的异步请求时很常见的。解决跨域问题,有很多的方法,这里仅介绍两种。

跨域问题演示

首先,创建一个以下页面,点击按钮,会执行异步请求(http://localhost:8080/hello)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script src="js/vue.js"></script>
    <script src="js/axios-0.18.0.js"></script>
    <script src="js/jquery-2.1.0.min.js"></script>
    <script>
        $(document).ready(function () {
            $("#btn").click(function () {
                $.post("http://localhost:8080/hello",function (data) {
                    console.log(data)
                })
            })
        })
    </script>
</head>
<body>
  <button id="btn">POST请求</button>
</body>
</html>

在这里插入图片描述


其次,将该页面部署到Nginx里。将该页面放在Nginx目录下的html文件夹下,注意名称要为index.html,替换掉Nginx默认的index页面

在这里插入图片描述


最后,在idea中创建一个SpringBoot的Web项目,在Controller层创建一个hello请求路径的方法

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EssayDemo {
    
    @RequestMapping("/hello")
    public String hello(){
        return "Hello Nginx!";
    }
}

启动Nginx和idea中的项目

在这里插入图片描述

页面测试,测试结果出现跨域错误(CORS),原因是Nginx的端口为80,该请求欲访问的链接端口为8080,即Tomcat的端口,故发送跨域错误

在这里插入图片描述
在这里插入图片描述

方法一:使用Nginx分发请求

可以在Nginx的配置文件中,设置upstream,对异步请求进行分发。

在这里插入图片描述

需要格外注意,修改配置很容易出错,建议先备份Nginx配置文件,再进行修改。另外,配置文件中的配置,空格(尤其是表示链接的斜杠附近)、分号(每行配置末尾都需要加分号)尤其需要小心。

修改完成后,在Nginx的启动程序处,打开CMD,重新加载(每次修改配置文件后都需要重新加载)

在这里插入图片描述

然后,需要清除一下浏览器的缓存
在这里插入图片描述

最后,将index.html页面中的端口,换成Nginx的端口,将异步请求交给Nginx进行转发

在这里插入图片描述

打开页面测试,可以看到跨域问题得到解决

在这里插入图片描述

方法二:在对应的请求方法上添加注解

可以在hello方法上加@CrossOrigin注解,表示允许跨域请求

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EssayDemo {

    @RequestMapping("/hello")
    @CrossOrigin
    public String hello(){
        return "Hello Nginx!";
    }
}

Nginx配置恢复默认设置
在这里插入图片描述

index.html页面,将请求链接改成Tomcat端口
在这里插入图片描述

重启idea项目,打开页面测试,可以看到跨域问题也解决了

在这里插入图片描述

总结

跨域问题是一个客户端问题。不是客户端的请求,后端接收不到,而是处于安全考虑,对跨域请求进行了限制。所以,前后端都可以通过各自的方式来解决。

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

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

相关文章

ChatGPT在媒体与娱乐领域的沉浸式场景:虚拟主持人和创意助手的新应用探索

第一章&#xff1a;引言 在当今数字化时代&#xff0c;人工智能技术在媒体与娱乐领域的应用日益广泛。ChatGPT作为一种先进的自然语言处理模型&#xff0c;具备强大的对话生成能力和创造力&#xff0c;为媒体与娱乐产业带来了新的创意和可能性。本文将探讨ChatGPT在媒体与娱乐…

学了那么长时间的编程,C语言的各种操作符都搞不懂?点开这里有详细的介绍—>

目录 前言 一、原码、反码、补码的基础概念 1.原码 2.反码 3.补码 二、原码、反码、补码的计算方法 1.原码 2.反码 3.补码 三、算术操作符 四、移位操作符 1. 左移操作符 移位规则&#xff1a; 2. 右移操作符 移位规则&#xff1a; &#xff08;1&#xff09; …

MySQL 中Relay Log打满磁盘问题的排查方案

MySQL 中Relay Log打满磁盘问题的排查方案 引言&#xff1a; MySQL Relay Log&#xff08;中继日志&#xff09;是MySQL复制过程中的一个重要组件&#xff0c;它用于将主数据库的二进制日志事件传递给从数据库。然而&#xff0c;当中继日志不断增长并最终占满磁盘空间时&…

【openGauss数据库审计项配置审计日志维护】--略有小成

【openGauss数据库审计项配置&审计日志维护】--略有小成 &#x1f53b; 一、openGauss数据库审计&#x1f530; 1.1 关于openGauss审计功能&#x1f530; 1.2 openGauss审计功能开启&#x1f530; 1.3 配置具体的审计项 &#x1f53b; 二、查看审计结果&#x1f53b; 三、维…

day13_类中成员之一:构造器

由来 我们发现我们new完对象时&#xff0c;所有成员变量都是默认值&#xff0c;如果我们需要赋别的值&#xff0c;需要挨个为它们再赋值&#xff0c;太麻烦了。我们能不能在new对象时&#xff0c;直接为当前对象的某个或所有成员变量直接赋值呢。可以&#xff0c;Java给我们提…

详解c++---map和set的封装

目录标题 前言红黑树的基本代码map和set的封装红黑树迭代器红黑树迭代器- -begin和end函数代码测试const迭代器方括号的实现 前言 通过之前的学习我们知道set容器中存储的数据是k&#xff0c;map容器中存储的数据是k和v&#xff0c;但是这两个容器底层都是通过红黑树来进行实现…

blfs:为lfs虚拟机增加桌面01

vmware中克隆一份lfs&#xff0c;扩大硬盘分区再操作。 1、硬盘拓展容量&#xff0c;分区挂载到/home&#xff08;已有的大小在后面编译桌面系统会捉襟见肘&#xff09; 使用fdisk进行分区 fdisk /dev/sda 执行p w分区并保存 mkfs -v -t ext4 /dev/sda4 转ext4格式 让/…

uniapp中使用mixins(混入)

mixins 选项接收一个混入对象的数组。这些混入对象可以像正常的实例对象一样包含实例选项&#xff0c;这些选项将会被合并到最终的选项中&#xff0c;使用的是和 Vue.extend() 一样的选项合并逻辑。也就是说&#xff0c;如果你的混入包含一个 created 钩子&#xff0c;而创建组…

如何使用ffmpeg将BDMV(m2ts)转换成MKV、MP4等其他格式的文件

BDMV 是蓝光碟使用的格式。这种格式没有办法使用播放软件播放&#xff0c;必须要用硬盘播放器&#xff0c;也就是专门的设备。但是最经典的 ffmpeg 可以将其转换成其他格式&#xff0c;并且保持相同的码率和清晰度&#xff0c;这样就可以很方便的查看了。 本文使用 macOS 进行…

加速度计的原理与应用

什么是加速度计 加速度计是一种传感器&#xff0c;可以测量物体所受加速的大小和方向。 加速度计的工作原理 传统加速度计利用质量和弹簧的相互作用来感应加速度&#xff0c;当物体收到加速度时&#xff0c;弹簧会发生变形&#xff0c;通过衡量这种变形来测量加速度的大小。 …

postgresql | 数据库| 生成2000W条的简单测试表

前言&#xff1a; 数据库学习的过程中&#xff0c;很可能需要数据量比较大的表来进行模拟测试&#xff0c;那么&#xff0c;测试表的创建需要遵循的是贴近实际的生产环境&#xff0c;尽量的模仿实际的生产环境。 因此&#xff0c;学习数据库的时候&#xff0c;快速的创建一个…

chatgpt赋能python:Python求单词长度:基于字符串操作的简单实现

Python求单词长度&#xff1a;基于字符串操作的简单实现 Python作为一种广泛应用于各个领域的编程语言&#xff0c;其强大的字符串操作功能在文本处理中经常被使用。本篇文章将介绍基于Python的字符串操作实现单词长度的方法。 什么是单词长度 在文本处理中&#xff0c;单词…

【Redis】1、学习 Redis 的五大基本数据类型【String、Hash、List、Set、SortedSet】

目录 一、NoSQL 和 SQL 区别二、认识 Redis三、Redis 的数据结构介绍四、Redis 通用命令五、String 类型六、key 的格式七、Hash&#xff08;散列&#xff09;类型八、List 类型九、Set 类型十、SortedSet 类型&#xff08;可排序&#xff09; 一、NoSQL 和 SQL 区别 二、认识 …

macOS Sonoma编译OpenCV源码输出IOS平台库

1.macOS下载并编译OpenCV源码: 克隆源码: 主仓: git clone https://github.com/opencv/opencv.git 扩展仓: git clone https://github.com/opencv/opencv_contrib.git 编译xcode源码需要CMake与XCode命令行工具 确认已安装CMake 确认已安装XCode 安装xcode command l…

UNZIP

目录 搭建环境 做题开始 通过ln直接创建 通过mkdir 后进行ln 搭建环境 这次是在自己的靶机环境里面搭建 cd /var/www/html index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</ti…

罗技k380键盘教程

在智能手机和平板电脑上享受台式电脑般舒适便捷的输入体验。罗技蓝牙™ 多设备键盘 K380 是一款小巧独特的键盘&#xff0c;让您在家中任何地方都能使用个人设备进行沟通和创作。 借助便捷的易于切换™ 按钮&#xff0c;可以通过蓝牙™ 无线技术同时连接最多三台设备&#xff…

【LeetCode】动态规划 刷题训练(一)

文章目录 面试题 08.01. 三步问题题目解析状态转移方程完整代码 746. 使用最小花费爬楼梯题目解析状态转移方程完整代码 91. 解码方法题目解析状态转移方程情况1&#xff1a;让i位置的数&#xff0c;单独去解码情况2&#xff1a;让i位置的数 和i-1位置的数 结合 一起去解码 完整…

安全合规进入场景细分时代

2022年6月1日&#xff0c;《中华人民共和国网络安全法》&#xff08;以下简称《网络安全法》&#xff09;正式实施迎来5周年。 作为国家实施网络空间管辖的第一部法律&#xff0c;《网络安全法》标志着我国网络安全工作有了基础性的法律框架&#xff0c;意味着建设网络强国的制…

chatgpt赋能python:Python清空:如何在Python中使用清空来删除变量和数据结构中的所有元素

Python清空&#xff1a;如何在Python中使用清空来删除变量和数据结构中的所有元素 在Python编程中&#xff0c;我们常常需要删除变量和数据结构中的元素。Python提供了多种方法来实现这一点&#xff0c;其中最常用的方法之一就是使用清空功能。在本文中&#xff0c;我们将介绍…

【期末总复习】机器学习(公式推导与代码实现)鲁伟

【第一章】机器学习预备知识 1、了解机器学习的发展简史 2、复述出训练集、验证集和测试集的作用 训练集&#xff08;Training set&#xff09; 作用是用来拟合模型&#xff0c;通过设置分类器的参数&#xff0c;训练分类模型。后续结合验证集作用时&#xff0c;会选出同一参…