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

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

你在使用 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 中轻松解决接口跨域访问问题” 的相关文章

Ubuntu 24.10发行版登场:Linux 6.11内核、GNOME 47桌面环境

IT之家 10 月 11 日消息,Canonical 昨日发布新闻稿,正式推出代号为 Oracular Oriole 的 Ubuntu 24.10 发行版。新版在内核方面升级到最新 6.11 版本,并采用 GNOME 47 桌面环境。Ubuntu 24.10 发行版调整了内核策略,开始选择最新的上游...

壹啦罐罐 Android 手机里的 Xposed 都装了啥

这是少数派推出的系列专题,叫做「我的手机里都装了啥」。这个系列将邀请到不同的玩家,从他们各自的角度介绍手机中最爱的或是日常使用最频繁的 App。文章将以「每周一篇」的频率更新,内容范围会包括 iOS、Android 在内的各种平台和 App。本期继续歪楼,由少数派撰稿作者@壹啦罐罐介绍他正在使用的...

2024最新版:前端性能优化方案汇总

前端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~Hello,大家好,我是 Sunday。前端性能优化一直是很多同学非常关注的问题,在日常的面试中也是经常会被问到的点。所以今天咱们就花一点时间来了解一下2024最新的...

2024年,不断突破的一年

迈凯伦F1车队不久前拿下了2024年度总冠军,距离上一次还是二十几年前。在此期间,另一领域内,一个充满革新活力的腕表品牌——RICHARD MILLE理查米尔,正不断发展,与F1运动、帆船、古董车展等领域,共享着对速度与极限的无尽向往。RICHARD MILLE的发展与F1车手们在赛道上的卓越表现交...

Gemini应用在Android上广泛推出2.0闪电模式切换器

#头条精品计划# 快速导读谷歌(搜索)应用的测试频道在安卓设备的双子应用中推出了2.0闪电实验功能,现已向稳定用户开放。双子应用通过谷歌应用运行,目前推出的15.50版本中,用户可通过模型选择器体验不同选项,包括1.5专业版、1.5闪电版和2.0闪电实验版。2.0闪电实验模型提供了更快的响应速度和优...

js中数组filter方法的使用和实现

定义filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。语法var newArray = arr.filter(callback(element[, index[, selfArr]])[, thisArg])参数callback循环数组每个元素时调用的回调函数。回调函...