当前位置:首页 > 技术分析 > 正文内容

在 Spring Boot3 中轻松解决接口跨域访问问题

ruisui881周前 (04-22)技术分析13

你在使用 Spring Boot3 进行后端开发时,是不是也被接口跨域访问的问题折磨得焦头烂额?满心期待着前端页面能顺畅获取后端接口数据,却总是因为跨域问题碰得一鼻子灰,是不是感觉特别无助?别担心,今天咱们就来把这个让人头疼的问题彻底弄明白。

在如今前后端分离的开发模式大行其道的环境下,Spring Boot 作为后端开发领域备受青睐的框架,处理跨域问题的重要性不言而喻。大家都知道,浏览器出于安全考量,制定了同源策略。通俗来讲,当两个页面的协议、主机以及端口号不完全一致时,从其中一个页面发起对另一个页面资源的请求,浏览器便会将其判定为跨域请求,无情地拦截数据传输。尤其是在我们使用 Spring Boot3 开发项目,搭配前端 Vue、React 等框架时,这种情况更是频繁出现,使得前后端通信仿佛被一道无形的墙阻隔,无法顺畅进行。

那么,在 Spring Boot3 中,到底有哪些行之有效的方法可以解决接口跨域访问的难题呢?

@CrossOrigin 注解解决方案

这是一种极为直观且应用广泛的方式。只需在控制器类或者控制器方法上添加 @CrossOrigin 注解,就能轻松掌控跨域请求。举个例子,假设我们有一个专门处理用户相关请求的控制器,代码可以像这样编写:

@RestController 
@RequestMapping("/user") 
@CrossOrigin(origins = "*") 
public class UserController {
    // 控制器方法,比如获取用户信息
    @GetMapping("/info")
    public User getUserInfo() {
        User user = new User();
        user.setName("张三");
        user.setAge(25);
        return user;
    }
}

这里的@CrossOrigin(origins = "*")意味着允许所有来源的请求跨域访问这个控制器。不过,在实际的生产环境里,从安全层面来考虑,强烈建议将origins设置为具体允许的来源。例如,若前端项目部署在http://your - front - end - domain.com,那么代码就可以调整为@CrossOrigin(origins = "http://your - front - end - domain.com") 。这样既能保证前后端正常通信,又能有效提升系统的安全性,防止不必要的跨域请求带来潜在风险。

实现 WebMvcConfigurer 接口解决方案

通过创建一个配置类实现 WebMvcConfigurer 接口,并覆盖addCorsMappings方法,我们便能进行全面的全局 CORS 配置。以下是详细的示例代码:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                       .allowedOrigins("http://allowed - origin.com")
                       .allowedMethods("GET", "POST", "PUT", "DELETE")
                       .allowedHeaders("*")
                       .allowCredentials(true)
                       .maxAge(3600);
            }
        };
    }
}

在这段代码中,registry.addMapping("/**")明确表示对所有的请求路径都进行跨域配置。allowedOrigins用于精准指定允许的来源,只有来自这个源头的请求才会被放行;allowedMethods详细设置了允许的请求方法,像常见的GET用于获取资源、POST用于提交数据、PUT用于更新资源、DELETE用于删除资源等;allowedHeaders则规定了允许的请求头,设置为*表示允许所有请求头,不过在一些对安全性要求极高的场景下,可能需要明确列举允许的请求头,以进一步降低风险;allowCredentials设置是否允许携带凭证,比如 Cookie 等,若设置为true,则在跨域请求时可以携带相关凭证;maxAge设置了预检请求的有效期,单位为秒,这里设置为 3600 秒,意味着在这个时间范围内,浏览器对于相同的跨域请求不会再次发起预检请求,从而提高请求效率。

Filter 过滤器解决方案

我们还可以借助自定义 Filter 来实现跨域请求的处理。首先,需要创建一个实现 Filter 接口的类,在其doFilter方法中精心设置跨域相关的响应头,比如关键的Access - Control - Allow - Origin等。下面是一个简单的示例代码:

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(filterName = "corsFilter", urlPatterns = "/*")
public class CorsFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("Access - Control - Allow - Origin", "http://allowed - origin.com");
        response.setHeader("Access - Control - Allow - Methods", "GET, POST, PUT, DELETE");
        response.setHeader("Access - Control - Allow - Headers", "Content - Type, Authorization");
        filterChain.doFilter(servletRequest, response);
    }
}

在上述代码中,@WebFilter(filterName = "corsFilter", urlPatterns = "/*")注解表明这是一个 Filter,并且对所有的 URL 路径都生效。在doFilter方法里,通过设置Access - Control - Allow - Origin指定允许的跨域来源,Access - Control - Allow - Methods设置允许的请求方法,Access - Control - Allow - Headers设置允许的请求头。设置完成后,再通过filterChain.doFilter(servletRequest, response)将请求传递给下一个 Filter 或者目标资源。不过,需要注意的是,倘若项目中 Filter 数量众多,这种方式可能会在一定程度上影响系统性能,而且与 Spring 框架的集成度相较于前两种方法也稍显逊色。在实际项目中运用时,需要综合多方面因素谨慎抉择。

总结

综上所述,在 Spring Boot3 中解决接口跨域访问问题有着多种切实有效的方法。各位开发者完全可以依据项目的具体实际需求以及安全要求,精准挑选最为合适的解决方案。希望这篇文章能够为那些正在被跨域问题深深困扰的后端开发人员们点亮一盏明灯。要是你在实践过程中遇到了任何问题,或者探索出了全新的解决方案,热烈欢迎在评论区踊跃留言分享。让我们携手共进,一同打造更加优质、高效、安全的后端服务!

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3517.html

标签: vue跨域
分享给朋友:

“在 Spring Boot3 中轻松解决接口跨域访问问题” 的相关文章

【Vue3 基础】05.组件化

这是 Vue3 + Vite + Pinia +TS + Element-Plus 实战系列文档。最近比较忙没什么时间写文章,争取早日把这个系列完结吧~生命周期和模板引用在本章之前,我们通过响应式 api 和声明式渲染,处理了 DOM 的更新,但光是这些,对于一些复杂的需要手动操作 DOM 的情况,...

7 招教你轻松搭建以图搜图系统

作者 | 小龙责编 | 胡巍巍当您听到“以图搜图”时,是否首先想到了百度、Google 等搜索引擎的以图搜图功能呢?事实上,您完全可以搭建一个属于自己的以图搜图系统:自己建立图片库;自己选择一张图片到库中进行搜索,并得到与其相似的若干图片。Milvus 作为一款针对海量特征向量的相似性检索引擎,旨在...

虚幻引擎5.5发布

IT之家 11 月 13 日消息,虚幻引擎 5.5 现已发布。据介绍,新版本虚幻引擎在动画创作、虚拟制作和移动游戏开发方面取得进步;渲染、摄像机内视觉特效和开发人员迭代等领域的部分功能已可用于生产。IT之家整理部分功能亮点如下:动画Sequencer增强虚幻引擎的非线性动画编辑器 Sequencer...

《暗黑破坏神 2:重制版》PC 版 2.3 版本发布,支持英伟达 DLSS

IT之家 12 月 3 日消息,暴雪为《暗黑破坏神 2:重制版》PC 版发布了更新 2.3 版本,添加了“离线难度缩放”滑块(玩家可以在单人游戏时增加挑战和奖励的级别)、多项辅助功能和用户界面改进,以及英伟达 DLSS 支持。玩法改进:玩家现在可以在离线游戏的选项菜单中使用“游戏难度等级”,它提供与...

最快清除数组空值?分享 1 段优质 JS 代码片段!

本内容首发于工粽号:程序员大澈,每日分享一段优质代码片段,欢迎关注和投稿!大家好,我是大澈!本文约 600+ 字,整篇阅读约需 1 分钟。今天分享一段优质 JS 代码片段,用最简洁的代码清除了数组中的空值。老规矩,先阅读代码片段并思考,再看代码解析再思考,最后评论区留下你的见解!const arr...

一文让你彻底搞懂 vue-Router

路由是网络工程里面的专业术语,就是通过互联把信息从源地址传输到目的地址的活动。本质上就是一种对应关系。分为前端路由和后端路由。后端路由:URL 的请求地址与服务器上的资源对应,根据不同的请求地址返回不同的资源。前端路由:在单页面应用中,根据用户触发的事件,改变URL在不刷新页面的前提下,改变显示内容...