在 Java 服务接口中解决跨域(CORS,Cross-Origin Resource Sharing)问题,通常需要在服务器端配置允许跨域访问。以下是在 Linux 服务器上为 Java 服务(以 Spring Boot 为例)设置跨域的详细步骤,涵盖常用方法和代码实现。
方法一:在 Java 代码中配置跨域
1. Spring Boot 配置跨域
Spring Boot 提供了简单的方式通过注解或配置类来启用 CORS。
方式 1:使用 @CrossOrigin
注解
在控制器(Controller)或具体方法上添加 @CrossOrigin
注解,允许特定来源的跨域请求。
java
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 配置
为整个应用配置跨域,适合需要所有接口支持跨域的场景。
java
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 {
@Override
public 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 文件:
bashmvn clean package
-
将 JAR 文件上传到 Linux 服务器(例如
/home/app/
)。 -
运行应用:
bashjava -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
,添加以下配置:
nginx
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
-
检查配置是否正确:
bashsudo nginx -t
-
重启 Nginx:
bashsudo systemctl restart nginx
3. 验证 Nginx 服务
确保 Nginx 和 Java 服务正常运行:
bash
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
):
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 并重启:
bash
sudo systemctl restart tomcat
方法四:通过 Linux 防火墙检查
确保 Linux 服务器的防火墙(如 firewalld
或 iptables
)允许前端访问的端口(通常是 80 或 8080)。
1. 检查防火墙
bash
sudo firewall-cmd --list-all
2. 开放端口
如果需要,开放端口(如 8080):
bash
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。bashcurl -H "Origin: http://example.com" -I http://your-domain.com/api/data
-
总结
- 推荐方式:优先使用 Spring Boot 的全局 CORS 配置(方法一,方式 2),简单且灵活。
- Nginx 配合:若已使用 Nginx 反向代理,可在 Nginx 配置 CORS(方法二)。
- Tomcat:适用于传统 WAR 包部署(方法三)。
- 防火墙:确保 Linux 服务器端口开放(方法四)。