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 服务器的防火墙(如 firewalld
或 iptables
)允许前端访问的端口(通常是 80 或 8080)。
1. 检查防火墙
sudo firewall-cmd --list-all
2. 开放端口
如果需要,开放端口(如 8080):
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
注意事项
- 安全性:
- 生产环境避免使用
allowedOrigins = "*"
,明确指定前端域名。 - 如果启用
allowCredentials(true)
,确保Access-Control-Allow-Origin
不是"*"
。
- 生产环境避免使用
- 优先级:
- 优先在 Java 代码中配置 CORS(如 Spring Boot),因为它更灵活且易于维护。
- 如果使用 Nginx 或 Tomcat,确认 Java 代码中没有冲突的 CORS 设置。
- 测试跨域:
- 使用浏览器开发者工具(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 服务器端口开放(方法四)。