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