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 注解,允许特定来源的跨域请求。

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 文件:

    bash 复制代码
    mvn clean package
  • 将 JAR 文件上传到 Linux 服务器(例如 /home/app/)。

  • 运行应用:

    bash 复制代码
    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,添加以下配置:

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
  • 检查配置是否正确:

    bash 复制代码
    sudo nginx -t
  • 重启 Nginx:

    bash 复制代码
    sudo 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 服务器的防火墙(如 firewalldiptables)允许前端访问的端口(通常是 80 或 8080)。

1. 检查防火墙
bash 复制代码
sudo firewall-cmd --list-all
2. 开放端口

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

bash 复制代码
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。

      bash 复制代码
      curl -H "Origin: http://example.com" -I http://your-domain.com/api/data

总结

  • 推荐方式:优先使用 Spring Boot 的全局 CORS 配置(方法一,方式 2),简单且灵活。
  • Nginx 配合:若已使用 Nginx 反向代理,可在 Nginx 配置 CORS(方法二)。
  • Tomcat:适用于传统 WAR 包部署(方法三)。
  • 防火墙:确保 Linux 服务器端口开放(方法四)。
相关推荐
陈序猿(代码自用版)7 小时前
【考研C语言编程题】数组元素批量插入实现(含图示+三部曲拆解)
c语言·开发语言·考研
唐•苏凯7 小时前
ArcGIS Pro 遇到严重的应用程序错误而无法启动
开发语言·javascript·ecmascript
用户9446814013508 小时前
部分替代Lombok?不可变数据的载体?一篇文章带你了解JDK16正式引用的record类型!
java
用户0332126663678 小时前
Java 高效处理 Word 文档:查找并替换文本的全面指南
java
轮到我狗叫了8 小时前
力扣.1054距离相等的条形码力扣767.重构字符串力扣47.全排列II力扣980.不同路径III力扣509.斐波那契数列(记忆化搜索)
java·算法·leetcode
渣哥8 小时前
你遇到过 ConcurrentModificationException 吗?其实很常见
java
lunzi_fly8 小时前
【源码解读之 Mybatis】【基础篇】-- 第1篇:MyBatis 整体架构设计
java·mybatis
JIngJaneIL8 小时前
汽车租赁|基于Java+vue的汽车租赁系统(源码+数据库+文档)
java·vue.js·spring boot·汽车·论文·毕设·汽车租赁系统
渣哥8 小时前
有一天,我和 CopyOnWriteArrayList 杯“线程安全”的咖啡
java