当前位置: 首页 > ds >正文

SpringBoot中解决跨域问题

一、使用@CrossOrigin注解
@CrossOrigin注解是Spring Boot提供的一个简单而直观的解决方案,它可以直接应用于控制器类或方法上。这种方式适合对特定接口或控制器进行跨域配置。

示例代码

@RestController
@RequestMapping("/api")
public class UserController {// 允许所有域名跨域访问该方法@CrossOrigin(origins = "*")@GetMapping("/getUser")public User getUser() {return new User("Alice", 25);}// 仅允许特定域名跨域访问@CrossOrigin(origins = "http://example.com")@PostMapping("/saveUser")public void saveUser(@RequestBody User user) {// 保存用户逻辑}
}

二、全局配置CORS
如果项目中的所有接口都需要支持跨域,全局配置CORS是一种更优雅的解决方案。我们可以通过实现WebMvcConfigurer接口来完成全局跨域配置。

示例代码

@Configuration
public class GlobalCorsConfig implements WebMvcConfigurer {@Override	public void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") // 允许所有路径的请求.allowedOrigins("http://example.com") // 允许的来源.allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的HTTP方法.allowedHeaders("*") // 允许的请求头.allowCredentials(true) // 是否允许发送Cookie.maxAge(3600); // 预检请求的缓存时间(秒)}
}

三、通过CorsFilter实现跨域
CorsFilter是Spring提供的另一种实现跨域的方式,它通过过滤器来处理跨域请求。这种方式同样可以实现全局跨域配置。

示例代码

@Configuration
public class CorsConfig {@Beanpublic CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();CorsConfiguration config = new CorsConfiguration();config.setAllowCredentials(true); // 是否允许发送Cookieconfig.addAllowedOrigin("http://example.com"); // 允许的来源config.addAllowedHeader("*"); // 允许的请求头config.addAllowedMethod("*"); // 允许的HTTP方法source.registerCorsConfiguration("/**", config); // 应用于所有路径return new CorsFilter(source);}
}

四、通过自定义过滤器实现跨域
如果需要更灵活的跨域处理逻辑,可以自定义一个过滤器来实现跨域支持。这种方式允许我们在过滤器中编写复杂的逻辑,以满足特定的业务需求。

示例代码

@Component
public class CustomCorsFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletResponse res = (HttpServletResponse) response;res.addHeader("Access-Control-Allow-Origin", "http://example.com");res.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");res.addHeader("Access-Control-Allow-Headers", "Content-Type");res.addHeader("Access-Control-Allow-Credentials", "true");if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) request).getMethod())) {res.setStatus(HttpServletResponse.SC_OK);} else {chain.doFilter(request, response);}}
}

五、使用Nginx解决跨域问题
除了在Spring Boot中直接处理跨域问题,我们还可以通过Nginx来解决跨域问题。这种方式将跨域处理逻辑从后端代码中分离出来,由Nginx代理完成跨域支持。

示例配置

server {listen 80;server_name example.com;location /api {proxy_pass http://localhost:8081; // 后端服务地址add_header 'Access-Control-Allow-Origin' 'http://example.com';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';add_header 'Access-Control-Allow-Headers' 'Content-Type';add_header 'Access-Control-Allow-Credentials' 'true';if ($request_method = 'OPTIONS') {add_header 'Access-Control-Max-Age' 1728000;add_header 'Content-Type' 'text/plain charset=UTF-8';add_header 'Content-Length' 0;return 204;}}
}
http://www.xdnf.cn/news/9634.html

相关文章:

  • Next.js 15 与 Apollo Client 的现代集成及性能优化
  • Web3 风控挑战重重,图数据库为何成为破局关键-悦数图数据库
  • Microsoft 推出 Magentic-UI,多智能体引领网页人机协作变革
  • Step9—Ambari Web UI 初始化安装 (Ambari3.0.0)
  • 用豆包写单元测试
  • Typescript学习教程,从入门到精通,TypeScript 泛型与类型操作详解(一)(16)
  • 2025河北秦皇岛CCPC【部分题解】
  • 开发手记:Vue 3 卷轴展开动画组件的实现与思考
  • Golang | 代理模式
  • 端口映射不通的原因有哪些?路由器设置后公网访问本地内网失败分析
  • 农业光合参数反演专栏
  • CSP 2024 提高级第一轮(CSP-S 2024)阅读程序第一题解析
  • 【Docker】技术架构演进
  • failed to bind host port for 0.0.0.0:3306
  • 【 Docker系列】 Docker部署kafka
  • 办公效率王Word批量转PDF 50 +文档一键转换保留原格式零错乱
  • GC1267F单相全波风扇电机预驱动器芯片详解
  • 精益数据分析(93/126):增长率的真相——从数据基准到科学增长策略
  • Linux 中常见的安全与权限机制
  • Vim常用快捷键
  • element-plus主题换色
  • React-native的新架构
  • unity一个箭矢的轨迹
  • 湖北理元理律师事务所:债务优化中的“生活锚点”设计
  • AI 让无人机跟踪更精准——从视觉感知到智能预测
  • HTML实战:响应式个人资料页面
  • 每日Prompt:心中的佛
  • 操作系统学习(一)——操作系统基础
  • 数据库管理与高可用-MySQL数据库操作
  • Prometheus学习之pushgateway和altermanager组件