处理Spring MVC 中的跨域问题

在 Spring MVC 中,跨域问题指的是浏览器从一个域名的网页去请求另一个域名的资源时,由于浏览器的同源策略而受到限制。同源策略要求浏览器在访问资源时,协议、域名和端口都必须相同,否则会产生跨域问题。以下是几种常见的处理 Spring MVC 中跨域问题的方法:

1. 使用 CORS(跨域资源共享)注解

原理

CORS 是一种现代的跨域解决方案,通过在服务器端设置响应头来允许跨域请求。Spring MVC 提供了@CrossOrigin注解,可以方便地在控制器或方法上启用 CORS 支持。

示例代码
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
// 允许所有来源的跨域请求
@CrossOrigin(origins = "*") 
public class CorsController {@GetMapping("/cors")public String corsTest() {return "This is a CORS enabled endpoint.";}
}
详细解释
  • @CrossOrigin注解可以应用在类或方法上。当应用在类上时,该类中的所有方法都将允许跨域请求;当应用在方法上时,只有该方法允许跨域请求。
  • origins属性指定允许访问该资源的外域 URI。设置为"*"表示允许所有来源的跨域请求,但在生产环境中,建议指定具体的域名,以提高安全性。

2. 配置全局 CORS 映射

原理

除了使用@CrossOrigin注解,还可以通过配置全局的 CORS 映射来处理跨域问题。这种方式可以统一管理所有控制器的跨域配置。

示例代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;@Configuration
public class CorsConfig {@Beanpublic CorsFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();// 允许所有域名进行跨域调用config.addAllowedOriginPattern("*"); // 允许任何请求头config.addAllowedHeader("*"); // 允许任何方法(POST、GET等)config.addAllowedMethod("*"); // 允许携带凭证(如Cookie)config.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();// 对所有接口都有效source.registerCorsConfiguration("/**", config); return new CorsFilter(source);}
}
详细解释
  • CorsConfiguration类用于配置 CORS 的相关信息,如允许的来源、请求头、请求方法等。
  • addAllowedOriginPattern("*"):允许所有域名进行跨域调用。在 Spring 5 及以上版本中,建议使用addAllowedOriginPattern而不是addAllowedOrigin,因为addAllowedOrigin不支持*和携带凭证同时使用。
  • addAllowedHeader("*"):允许任何请求头。
  • addAllowedMethod("*"):允许任何请求方法,如 GET、POST 等。
  • setAllowCredentials(true):允许携带凭证(如 Cookie)进行跨域请求。
  • UrlBasedCorsConfigurationSource用于将 CORS 配置映射到具体的 URL 路径上,这里将配置应用到所有接口("/**")。
  • CorsFilter是一个过滤器,用于处理跨域请求。

3. 使用 JSONP(JSON with Padding)

原理

JSONP 是一种传统的跨域解决方案,它利用了<script>标签的src属性不受同源策略限制的特点。服务器返回的数据会被包装在一个回调函数中,客户端通过<script>标签请求该数据,从而实现跨域数据传输。

示例代码
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class JsonpController {@GetMapping("/jsonp")public String jsonpTest(@RequestParam("callback") String callback) {String jsonData = "{\"message\": \"This is a JSONP response.\"}";return callback + "(" + jsonData + ")";}
}
详细解释
  • 客户端请求时需要传递一个回调函数名作为参数(通常命名为callback)。
  • 服务器接收到请求后,将返回的数据包装在该回调函数中,并返回给客户端。
  • 客户端的<script>标签会执行该回调函数,从而获取到服务器返回的数据。
客户端代码示例
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>JSONP Example</title><script>function handleResponse(data) {console.log(data.message);}</script>
</head>
<body><script src="http://localhost:8080/jsonp?callback=handleResponse"></script>
</body>
</html>

4. 使用代理服务器

原理

在开发环境中,可以使用代理服务器来解决跨域问题。代理服务器与前端页面处于同一域名下,前端页面向代理服务器发送请求,代理服务器再将请求转发到目标服务器,并将响应返回给前端页面。

示例:使用 Webpack Dev Server 进行代理

webpack.config.js中进行如下配置:

const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html - webpack - plugin');module.exports = {// 其他配置...devServer: {proxy: {'/api': {target: 'http://backend-server.com', changeOrigin: true,pathRewrite: { '^/api': '' }}}},// 其他配置...
};
详细解释
  • target:指定目标服务器的地址。
  • changeOrigin:设置为true表示在转发请求时改变请求的源地址,以避免服务器端的一些限制。
  • pathRewrite:用于重写请求路径,将/api前缀去掉。

不同方法的适用场景和优缺点

  • CORS 注解和全局 CORS 映射:适用于现代 Web 应用开发,是推荐的跨域解决方案。优点是简单易用,支持多种配置选项,安全性较高;缺点是需要服务器端支持,对于一些旧的浏览器可能不兼容。
  • JSONP:适用于需要兼容旧浏览器的场景。优点是兼容性好;缺点是只支持 GET 请求,安全性较低,因为它是通过<script>标签实现的,可能存在 XSS(跨站脚本攻击)风险。
  • 代理服务器:适用于开发环境,方便前端开发人员调试。优点是不需要修改服务器端代码,简单方便;缺点是需要额外配置代理服务器,在生产环境中使用较为复杂。

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

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

相关文章

基于知乎平台的“开源AI智能名片2 + 1链动模式S2B2C商城小程序”引流策略研究

摘要&#xff1a;本文聚焦于如何借助知乎平台的高权重及优质用户特性&#xff0c;对“开源AI智能名片2 1链动模式S2B2C商城小程序”进行有效引流。通过深入分析知乎平台的用户特点、引流规则&#xff0c;并结合具体的引流方法&#xff0c;旨在为相关项目在知乎平台实现高效用户…

Oracle CDB自动处理表空间不足脚本

之前我曾经发过一个自动处理表空间的脚本&#xff0c;可以通过定时任务自动处理表空间不足的问题&#xff1b;但是之前那个脚本没有涵盖CDB模式下的PDB&#xff0c;这里将脚本做了一下更新&#xff0c;可以处理CDB模式下多PDB的表空间问题。 传统模式的脚本请参考这个链接 Or…

在 Navicat 17 中扩展 PostgreSQL 数据类型 | 创建自定义域

定义域 以适当的格式存储数据可以确保数据完整性&#xff0c;防止错误&#xff0c;优化性能&#xff0c;并通过实施验证规则和支持高效数据管理来维护系统间的一致性。基于这些原因&#xff0c;顶级关系数据库&#xff08;如PostgreSQL&#xff09;提供了多种数据类型。此外&a…

CentOS 环境下 Docker、Jenkins、GitLab 和 Kubernetes 安装与配置

以下是针对 CentOS 系统的安装和配置步骤&#xff0c;涵盖 Docker、Jenkins、GitLab 和 Kubernetes (K8s)&#xff0c;以及 CI/CD 流程的配置。通过这些步骤&#xff0c;可以搭建一个企业级 DevOps 环境。 1. 安装和配置 Docker 1.1 安装 Docker&#xff08;CentOS 示例&…

细说机器学习数学优化之梯度下降

系列文章目录 第一章&#xff1a;Python 机器学习数学优化之梯度下降 目录 系列文章目录 前言 一、基本原理&#xff1a; 二、使用步骤: 三、梯度下降类型&#xff1a; 四、应用场景&#xff1a; 总结 前言 梯度下降&#xff08;Gradient Descent&#xff09;是人工…

Postgresql的三种备份方式_postgresql备份

这种方式可以在数据库正在使用的时候进行完整一致的备份&#xff0c;并不阻塞其它用户对数据库的访问。它会产生一个脚本文件&#xff0c;里面包含备份开始时&#xff0c;已创建的各种数据库对象的SQL语句和每个表中的数据。可以使用数据库提供的工具pg_dumpall和pg_dump来进行…

青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用

青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用 一、类类的定义和使用示例 二、定义1. 类定义语法2. 属性和方法3. 构造器和初始化4. 实例化5. 类变量和实例变量6. 类方法和静态方法7. 继承8. 多态总结 三、使用1. 创建类的实例2. 访问属性3. 调用方法4. 修…

[Collection与数据结构] B树与B+树

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之修改密码和个人资料

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【Spring篇】【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f383;1.修改密码 -持久…

蓝桥杯小白打卡第二天

789. 数的范围 题目描述 给定一个按照升序排列的长度为 n n n 的整数数组&#xff0c;以及 q q q 个查询。 对于每个查询&#xff0c;返回一个元素 k k k 的起始位置和终止位置&#xff08;位置从 0 0 0 开始计数&#xff09;。 如果数组中不存在该元素&#xff0c;则返…

Vue WebSocket简单应用 ws

webSocket应用 <template><div></div> </template><script> import { getToken } from "/utils/auth"; export default {data() {return {url: "",Socket: null, //socket对象lockReconnect: false, //锁定拒绝重连close: …

【Elasticsearch】terms聚合误差问题

Elasticsearch中的聚合查询在某些情况下确实可能存在误差&#xff0c;尤其是在处理分布式数据和大量唯一值时。这种误差主要来源于以下几个方面&#xff1a; 1.分片数据的局部性 Elasticsearch的索引通常被分成多个分片&#xff0c;每个分片独立地计算聚合结果。由于数据在分…

电脑可以自己换显卡吗?怎么操作

电脑是否可以自己换显卡主要取决于电脑的类型&#xff08;台式机或笔记本&#xff09;以及电脑的硬件配置。以下是对这一问题的详细解答及操作步骤&#xff1a; 一、判断电脑是否支持更换显卡 台式机&#xff1a;大多数台式电脑都支持更换显卡。只要主板上有PCIe插槽&#xff…

element-plus+vue3前端如何根据name进行搜索查到符合条件的数据

界面如图&#xff0c;下面的区域是接口给的所有的&#xff0c;希望前端根据输入的内容自己去匹配。 我是使用的element-plusvue3ts的写法。 <el-input v-model"filters.region" placeholder"输入区域搜索" keyup"filterRegion(filters.region)&q…

从离散傅里叶变换(DFT)到快速傅里叶变换(FFT)

摘要 离散傅里叶变换&#xff08;DFT&#xff09;是数字信号处理领域中分析信号频域特性的重要工具&#xff0c;但直接计算DFT的复杂度较高&#xff0c;限制了其在大规模数据处理中的应用。快速傅里叶变换&#xff08;FFT&#xff09;的出现显著降低了计算复杂度&#xff0c;极…

Oracle常用响应文件介绍(19c)

文章目录 1. 数据库安装响应文件1.1 响应文件模板1.2 参数说明1.2.1 响应文件版本参数1.2.2 安装选项参数1.2.3 Unix 用户组参数1.2.4 软件清单参数1.2.5 安装目录参数1.2.6 安装版本参数1.2.7 特权操作权限组指定参数1.2.8 Root脚本执行配置参数1.2.9 Grid选项配置参数1.2.10 …

【3分钟极速部署】在本地快速部署deepseek

第一步&#xff0c;找到网站&#xff0c;下载&#xff1a; 首先找到Ollama &#xff0c; 根据自己的电脑下载对应的版本 。 我个人用的是Windows 我就先尝试用Windows版本了 &#xff0c;文件不是很大&#xff0c;下载也比较的快 第二部就是安装了 &#xff1a; 安装完成后提示…

基于Typescript,使用Vite构建融合Vue.js的Babylon.js开发环境

一、创建Vite项目 使用Vite初始化一个VueTypeScript项目&#xff1a; npm create vitelatest my-babylon-app -- --template vue-ts cd my-babylon-app npm create vitelatest my-babylon-app -- --template vue-ts 命令用于快速创建一个基于 Vite 的 Vue TypeScript 项目。…

Zookeeper入门部署(单点与集群)

本篇文章基于docker方式部署zookeeper集群&#xff0c;请先安装docker 目录 1. docker初期准备 2.启动zookeeper 2.1 单点部署 2.2 集群部署 3. Linux脚本实现快速切换启动关闭 1. docker初期准备 拉取zookeeper镜像 docker pull zookeeper:3.5.6 如果拉取时间过长&#xf…

QMK启用摇杆和鼠标按键功能

虽然选择了触摸屏&#xff0c;我仍选择为机械键盘嵌入摇杆模块&#xff0c;这本质上是对"操作连续性"的执着。   值得深思的是&#xff0c;本次开发过程中借助DeepSeek的代码生成与逻辑推理&#xff0c;其展现的能力已然颠覆传统编程范式&#xff0c;需求描述可自动…