Java Jersey构建的REST API跨域请求(CORS)被阻止问题求助
解决Jersey + Spring Boot REST API的CORS跨域问题
你遇到的这个跨域问题是浏览器同源策略导致的——你的前端跑在http://localhost:80,后端API在http://localhost:8093,端口不同属于不同源,浏览器会拦截跨域请求。下面给你两种适配你当前技术栈的解决方案:
方案一:使用Jersey自带的CORS过滤器
这是最贴合Jersey框架的方式,我们可以自定义一个响应过滤器来添加CORS相关的HTTP头:
- 创建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"); } }
- 在你的
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
相关产品推荐
相关产品推荐

