You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Jersey构建的REST API跨域请求(CORS)被阻止问题求助

解决Jersey + Spring Boot REST API的CORS跨域问题

你遇到的这个跨域问题是浏览器同源策略导致的——你的前端跑在http://localhost:80,后端API在http://localhost:8093,端口不同属于不同源,浏览器会拦截跨域请求。下面给你两种适配你当前技术栈的解决方案:

方案一:使用Jersey自带的CORS过滤器

这是最贴合Jersey框架的方式,我们可以自定义一个响应过滤器来添加CORS相关的HTTP头:

  1. 创建CORS过滤器类:
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;

@Provider
public class CorsFilter implements ContainerResponseFilter {
    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
        // 允许所有源跨域,生产环境建议替换为具体前端域名
        responseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
        // 允许的请求方法
        responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        // 允许的请求头
        responseContext.getHeaders().add("Access-Control-Allow-Headers", "Content-Type, Authorization");
        // 允许携带凭证(如果前端需要传Cookie等)
        responseContext.getHeaders().add("Access-Control-Allow-Credentials", "true");
    }
}
  1. 在你的Application类里注册这个过滤器:
    修改Application的构造方法,把过滤器加入注册列表:
public Application() {
    register(new UserAPI());
    register(CorsFilter.class); // 新增这行注册CORS过滤器
}

方案二:使用Spring Boot全局CORS配置

因为你的项目是Spring Boot整合Jersey,也可以用Spring的全局配置来统一处理跨域,这样不需要单独写Jersey过滤器:

创建一个Spring配置类,实现WebMvcConfigurer:

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 GlobalCorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/rest/**") // 匹配你的Jersey API路径前缀
                .allowedOrigins("http://localhost:80") // 指定允许的前端源,安全性更高
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                .allowCredentials(true);
    }
}

额外小提示

  • 浏览器发送的OPTIONS预检请求Jersey会自动处理,不需要你额外编写接口;
  • 生产环境强烈建议不要用*允许所有源,而是指定具体的前端域名,比如http://your-production-frontend.com,避免安全风险;
  • 顺带提一句:RESTful风格里删除资源一般用DELETE方法,你代码里用POST请求/delete也能跑,但换用DELETE会更规范哦~

内容的提问来源于stack exchange,提问作者ricciuto99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 19:44:05