跨域问题的4种解决方案

devtools/2024/10/15 5:29:19/

文章导读

图片

前言

  跨域问题指的是在Web开发中,由于浏览器的同源策略限制,当一个网页尝试访问与它不同源(协议、域名或端口不同)的资源时,可能会遇到安全限制导致无法正常访问的问题。这种策略旨在防止恶意网站读取或修改其他网站的数据,保护用户信息安全。

这样说可能有点抽象,下面具体展开说明。

跨域问题演示

  通常情况下,我们主流的开发模式是:前后端分离。当我们从浏览器80访问服务端81应用

图片

下面我们用一个Web工程,一个后端工程具体简单演示下。

1、Web工程结构:

图片

  • application.properties

spring.application.name=springboot-cross-web
server.port=8080
  • index.html 页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>测试跨域请求页面</title><script src="js/jquery-3.5.1.min.js"></script>
</head>
<body>
<div><input type="button" onclick="crossSubmit()" value="跨域测试">
</div>
<script>function crossSubmit() {// 发送跨域请求jQuery.ajax({url: "http://localhost:8081/api/cross",type: "POST",data: {"key": "Cross"},success: function (result) {alert("返回数据:" + result.data);}});}
</script>
</body>
</html>

2、后端工程结构:

图片

  • application.properties

spring.application.name=springboot-cross
server.port=8081
  • 测试应用

@RestController
public class CrossAppController {@RequestMapping("/api/cross")public HashMap<String, Object> crossTest() {return new HashMap<String, Object>() {{put("state", 200);put("data", "success");}};}
}

3、启动并测试

图片

浏览器报错产生跨域问题。

为什么产生跨域问题?

一般来讲,通常产生跨域问题有以下几种原因:

  1. 协议不同:如 https和http;

  2. 端口不同

  3. 域名不同

图片

这就是常说的同源策略的问题。产生跨域问题的根源就是请求不同源。

如何解决跨域问题?

从上边的问题来看,主要在于浏览器保护,对参数 "Access-Control-Allow-Origin"的设置。

主要有下解决方案:

一、使用@CrossOrigin注解

@RestController
@CrossOrigin(origins = "*")
public class CrossAppController {@RequestMapping("/api/cross")public HashMap<String, Object> crossTest() {return new HashMap<String, Object>() {{put("state", 200);put("data", "success");}};}
}

演示结果:

图片

二、使用全局跨域配置

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/cross").allowedOrigins("*").allowedMethods("GET", "POST", "PUT", "DELETE").allowedHeaders("*");//.allowCredentials(true);}
}

三、使用CorsFilter跨域

@Component
public class CorsFilter implements Filter {@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {HttpServletResponse response = (HttpServletResponse) res;HttpServletRequest request = (HttpServletRequest) req;// 设置允许的来源response.setHeader("Access-Control-Allow-Origin", "*");// 处理预检请求if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {response.setStatus(HttpServletResponse.SC_OK);} else {chain.doFilter(req, res);}}
}

四、使用Nginx来实现跨域

server {  listen 80;  server_name your.domain.com;  location / {  # 添加CORS相关的响应头  add_header 'Access-Control-Allow-Origin' '*';  add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';  add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';  # 对于OPTIONS请求,直接返回204状态码  if ($request_method = 'OPTIONS') {  return 204;  }  # 其他配置...  # 代理到后端服务或其他配置...  # proxy_pass http://your_backend/;  # 其他proxy_...指令...  }  
}

总结

  • 跨域问题指的是在Web开发中,由于浏览器的同源策略限制,导致无法正常访问的问题。

  • 主要原理就是请求参数Access-Control-Allow-Origin


http://www.ppmy.cn/devtools/42671.html

相关文章

重大活动网络安全保障建设及运营指南

在当今高度数字化的社会中&#xff0c;各类重大活动如会议、展览、赛事及庆典等正面临着日益复杂和严峻的网络安全威胁。这些威胁不限于网络入侵或数据泄露&#xff0c;更涉及到对基础设施、关键信息系统和公众舆论的复杂攻击&#xff0c;需要国际社会的密切合作和长期关注。因…

word-形状绘制、smartart、visio

一、人员架构图绘制 小技巧&#xff1a; 1、ctrlshift水平复制 2、点击图形&#xff0c;右键设置为默认形状 3、插入-形状-右键-锁定绘图模式&#xff0c;按esc退出状态 4、插入-形状-新建绘图画布&#xff0c;代替组合问题 画布中存在锚点&#xff0c;便于直线连接 二、s…

JS三种for遍历方法

在JavaScript中&#xff0c;for, forEach, 和 for...in 都是用来遍历集合的方法&#xff0c;但它们有不同的使用场景和特性。下面是详细的解释和比较&#xff1a; 1. for 循环 for 循环是最基本的循环结构&#xff0c;用于遍历数组或执行一组语句指定的次数。 语法 for (in…

linux命令日常使用思考

linux命令日常使用思考 复制的相关问题scp和cp的区别root192.168.5.229-r的理解 更新版本的相关问题svn info 根目录和家目录的区别根目录家目录 复制的相关问题 scp和cp的区别 安全性&#xff1a;SCP 是基于 SSH 的加密传输协议&#xff0c;可以保证数据在传输过程中的安全性…

ArcGIS提取含有计曲线的等高线

喜欢就关注我们吧&#xff01; 今天我么来看看&#xff0c;如何利用DEM提取含有计曲线的等高线&#xff01; 常规的话我们利用DEM提取的等高线都是不带计曲线的&#xff0c;无法把计曲线标注出来&#xff0c;今天我们就来看下&#xff0c;如何处理一下哦&#xff01;提取带有计…

【计算机网络原理】对传输层TCP协议的重点知识的总结

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

测试用例篇

测试用例的基本要素 **测试用例是为了实施测试而向被测试的系统提供的一组集合&#xff0c;这组集合包含&#xff1a;测试环 **境、操作步骤、测试数据、预期结果等要素.评价测试用例的标准&#xff1a;**对比好坏用例的评价标准 **用例表达清楚&#xff0c;无二义性用例可操作…

鸿蒙ArkUI-X跨平台技术:【开发准备】

开发准备 本文档适用于ArkUI跨平台应用开发的初学者。通过开发环境搭建、应用工程创建、编译和运行&#xff0c;熟悉ArkUI跨平台应用开发基本流程。 在开始之前&#xff0c;您需要了解有关跨平台应用的一些基本概念&#xff1a;ArkUI框架的简单说明、ArkUI-X的基本概念。 基…