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

Java 服务接口中解决跨域(CORS,Cross-Origin Resource Sharing)问题

在 Java 服务接口中解决跨域(CORS,Cross-Origin Resource Sharing)问题,通常需要在服务器端配置允许跨域访问。以下是在 Linux 服务器上为 Java 服务(以 Spring Boot 为例)设置跨域的详细步骤,涵盖常用方法和代码实现。


方法一:在 Java 代码中配置跨域

1. Spring Boot 配置跨域

Spring Boot 提供了简单的方式通过注解或配置类来启用 CORS。

方式 1:使用 @CrossOrigin 注解

在控制器(Controller)或具体方法上添加 @CrossOrigin 注解,允许特定来源的跨域请求。

import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/api")
public class MyController {@CrossOrigin(origins = {"http://example.com", "http://localhost:8080"})@GetMapping("/data")public String getData() {return "Hello from API";}
}
  • origins: 指定允许的来源(如前端域名或 IP)。
  • 适用场景: 适合小规模接口,单个或少量接口需要跨域。
方式 2:全局 CORS 配置

为整个应用配置跨域,适合需要所有接口支持跨域的场景。

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 {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") // 所有接口.allowedOrigins("http://example.com", "http://localhost:8080") // 允许的域名.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的请求方法.allowedHeaders("*") // 允许的请求头.allowCredentials(true) // 是否允许发送 Cookie.maxAge(3600); // 预检请求缓存时间(秒)}
}
  • 说明:
    • addMapping("/**"): 表示对所有接口启用跨域。
    • allowedOrigins: 可设置为 "*"(允许所有来源,生产环境不推荐)或具体域名。
    • allowCredentials(true): 如果前端需要发送 Cookie,需启用此项,同时 allowedOrigins 不能为 "*"
2. 打包与部署
  • 打包 Spring Boot 应用为 JAR 文件:
    mvn clean package
    
  • 将 JAR 文件上传到 Linux 服务器(例如 /home/app/)。
  • 运行应用:
    java -jar /home/app/your-app.jar
    

方法二:通过 Web 服务器(如 Nginx)配置跨域

如果 Java 服务部署在 Nginx 反向代理后,可以在 Nginx 配置文件中设置 CORS。

1. 编辑 Nginx 配置文件

假设 Nginx 配置文件位于 /etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf,添加以下配置:

server {listen 80;server_name your-domain.com;location / {proxy_pass http://localhost:8080; # 代理到 Java 服务proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;# CORS 配置add_header 'Access-Control-Allow-Origin' 'http://example.com' always;add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;add_header 'Access-Control-Allow-Credentials' 'true' always;add_header 'Access-Control-Max-Age' 3600 always;# 处理 OPTIONS 预检请求if ($request_method = 'OPTIONS') {return 204;}}
}
  • 说明:
    • Access-Control-Allow-Origin: 指定允许的来源,生产环境建议明确域名。
    • if ($request_method = 'OPTIONS'): 处理浏览器的预检请求,直接返回 204 状态码。
2. 检查并重启 Nginx
  • 检查配置是否正确:
    sudo nginx -t
    
  • 重启 Nginx:
    sudo systemctl restart nginx
    
3. 验证 Nginx 服务

确保 Nginx 和 Java 服务正常运行:

sudo systemctl status nginx
ps -ef | grep java

方法三:通过 Apache Tomcat 配置跨域

如果 Java 服务部署在 Tomcat 上,可以通过 web.xml 或过滤器配置 CORS。

1. 添加 CORS 过滤器

编辑 Tomcat 的 web.xml(通常位于 webapps/your-app/WEB-INF/web.xml):

<filter><filter-name>CorsFilter</filter-name><filter-class>org.apache.catalina.filters.CorsFilter</filter-class><init-param><param-name>cors.allowed.origins</param-name><param-value>http://example.com,http://localhost:8080</param-value></init-param><init-param><param-name>cors.allowed.methods</param-name><param-value>GET,POST,PUT,DELETE,OPTIONS</param-value></init-param><init-param><param-name>cors.allowed.headers</param-name><param-value>Content-Type,X-Requested-With,Accept,Origin</param-value></init-param><init-param><param-name>cors.support.credentials</param-name><param-value>true</param-value></init-param>
</filter>
<filter-mapping><filter-name>CorsFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
2. 重启 Tomcat

将修改后的应用部署到 Tomcat 并重启:

sudo systemctl restart tomcat

方法四:通过 Linux 防火墙检查

确保 Linux 服务器的防火墙(如 firewalldiptables)允许前端访问的端口(通常是 80 或 8080)。

1. 检查防火墙
sudo firewall-cmd --list-all
2. 开放端口

如果需要,开放端口(如 8080):

sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload

注意事项

  1. 安全性:
    • 生产环境避免使用 allowedOrigins = "*",明确指定前端域名。
    • 如果启用 allowCredentials(true),确保 Access-Control-Allow-Origin 不是 "*"
  2. 优先级:
    • 优先在 Java 代码中配置 CORS(如 Spring Boot),因为它更灵活且易于维护。
    • 如果使用 Nginx 或 Tomcat,确认 Java 代码中没有冲突的 CORS 设置。
  3. 测试跨域:
    • 使用浏览器开发者工具(F12)检查网络请求,确认响应头包含正确的 CORS 头。
    • 测试工具:curl 或 Postman。
      curl -H "Origin: http://example.com" -I http://your-domain.com/api/data
      

总结

  • 推荐方式:优先使用 Spring Boot 的全局 CORS 配置(方法一,方式 2),简单且灵活。
  • Nginx 配合:若已使用 Nginx 反向代理,可在 Nginx 配置 CORS(方法二)。
  • Tomcat:适用于传统 WAR 包部署(方法三)。
  • 防火墙:确保 Linux 服务器端口开放(方法四)。

文章转载自:

http://hl92DQJP.qbxdt.cn
http://jkfO7Hmh.qbxdt.cn
http://5xZtexP9.qbxdt.cn
http://9nt6WaTa.qbxdt.cn
http://e2U3RBEw.qbxdt.cn
http://oqX02Vaf.qbxdt.cn
http://65LCrL57.qbxdt.cn
http://zcppY5CJ.qbxdt.cn
http://3JTVuk9c.qbxdt.cn
http://0qNLQ6PA.qbxdt.cn
http://zN6cuwTO.qbxdt.cn
http://69bly6I6.qbxdt.cn
http://tvFgnaoE.qbxdt.cn
http://nq5xMFr3.qbxdt.cn
http://hxP1C2Pg.qbxdt.cn
http://5qETL24n.qbxdt.cn
http://uUfPBftv.qbxdt.cn
http://F4gng3Lo.qbxdt.cn
http://mbF3kpmZ.qbxdt.cn
http://hci6rGP0.qbxdt.cn
http://uUNZuuYa.qbxdt.cn
http://ZoOAYJ7c.qbxdt.cn
http://BjLvxyVb.qbxdt.cn
http://ddc3OMQ2.qbxdt.cn
http://qPiOfBQo.qbxdt.cn
http://BsptlFak.qbxdt.cn
http://GtwYwTWG.qbxdt.cn
http://lFXidhpM.qbxdt.cn
http://6LaipPkR.qbxdt.cn
http://b7pGSaPo.qbxdt.cn
http://www.dtcms.com/a/373764.html

相关文章:

  • 【VLNs篇】09:NavA³—理解任意指令,导航任意地点,找到任意物体
  • JS实现丝滑文字滚动
  • 小程序获取手机号完整流程 弹出框获取电话号码
  • Claude API 到智谱 API 迁移全流程教程(含兼容性对比)
  • 玩转Docker | 使用Docker部署Umbrel操作系统
  • 一客一策:Data Agent 如何重构大模型时代的智能营销
  • 一次用户请求的网络之旅
  • Java 泛型知识点
  • 天硕工业级SSD固态硬盘凭什么寿命更长?
  • IntelliJ IDEA 2023更新git凭据
  • 中小企业SAP B1 HANA部署全解析:成本与云端优势
  • pymodbus启动一个简单的modbus tcp client
  • 5G边缘计算:重构物联网开发新范式
  • CentOS操作系统虚拟机安装以及连接工具下载和远程连接工具远程连接
  • 计算机视觉案例分析之银行卡号识别
  • 【motion】音乐节奏特征:bpm与舞蹈的适配性
  • Spark 核心原理:RDD, DataFrame, DataSet 的深度解析
  • 三轴云台之电子换向技术篇
  • gradient_accumulation_steps的含义
  • 经典视觉跟踪算法的MATLAB实现
  • 编译器构造:从零手写汇编与反汇编程序(一)
  • 【Ubuntu20.04 + VS code 1.103.2 最新版,中文输入法失效】
  • 【开题答辩全过程】以 基于Python的北城公务用车系统设计与实现_为例,包含答辩的问题和答案
  • Proximal SFT:用PPO强化学习机制优化SFT,让大模型训练更稳定
  • 2025年Q3 GEO优化供应商技术能力评估与行业应用指南
  • 25上半年软考网工备考心得
  • XPath:从入门到能用
  • Kotlin协程 -> Job.join() 完整流程图与核心源码分析
  • [优选算法专题二滑动窗口——串联所有单词的子串]
  • VR森林防火模拟进行零风险演练,成本降低​