Ionic+Angular 2.0 POST请求跨域报错,加响应头仍无效求助
解决Ionic+Angular 2向JAX-RS后端发送POST请求的CORS问题
你遇到的核心问题是浏览器发送的CORS预检OPTIONS请求没被后端正确处理。你现在只在POST请求的响应里加了CORS头,但浏览器在发送实际POST请求前,会先发起一个OPTIONS预检请求验证跨域权限——而你的后端没处理这个请求,导致它返回的响应里没有Access-Control-Allow-Origin等必要头,所以浏览器直接拦截了后续的POST请求。
下面给你两种实用的解决方案:
方案一:在当前JAX-RS服务中直接处理OPTIONS请求
在你的JSONService类里新增一个OPTIONS方法,专门返回带CORS头的响应,让预检请求能顺利通过:
@Path("/register") public class JSONService { // 保留你原有的POST业务逻辑,把CORS头代码抽出来复用 @POST @Path("/post") @Produces("application/json") @Consumes("application/json") public Response createPlayerInJSON(RegisterPlayer player) { // 原有的数据库操作、结果拼接逻辑... // 最后调用复用方法添加CORS头 String jsonResult = "{\"name\":\"" + requestedJSON.getString("name") + "\",\"email\":\"" + requestedJSON.getString("email") + "\"}"; return buildCorsResponse(Response.ok(jsonResult)); } // 新增:处理OPTIONS预检请求 @OPTIONS @Path("/post") public Response handleOptionsRequest() { return buildCorsResponse(Response.ok()); } // 复用的CORS头构建方法,避免重复代码 private Response buildCorsResponse(Response.ResponseBuilder builder) { return builder .header("Access-Control-Allow-Origin", "*") .header("Access-Control-Allow-Headers", "Origin, Content-Type, Accept") .header("Access-Control-Allow-Credentials", "true") .header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD") .header("Access-Control-Max-Age", "1209600") .build(); } // 原有的异常捕获逻辑... }
方案二:全局CORS过滤器(更推荐)
如果你的后端有多个API接口,一个个加OPTIONS方法太繁琐,可以用JAX-RS的ContainerResponseFilter实现全局CORS处理——所有请求的响应都会自动带上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 GlobalCorsFilter implements ContainerResponseFilter { @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) { responseContext.getHeaders().add("Access-Control-Allow-Origin", "*"); responseContext.getHeaders().add("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, Authorization"); responseContext.getHeaders().add("Access-Control-Allow-Credentials", "true"); responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); responseContext.getHeaders().add("Access-Control-Max-Age", "1209600"); } }
注意要把这个过滤器类放在JAX-RS容器能扫描到的包下(比如和你的JSONService同包),这样它才能自动生效。
额外检查点
- 你问题里写的请求地址是
https://somedomain.com/...,但Angular代码里的apiPath是http://somedomain.com/...,如果后端用的是HTTPS,这里要改成HTTPS,避免协议不匹配。 - 如果后端有认证逻辑(比如Basic Auth),记得在
Access-Control-Allow-Headers里加上Authorization字段。
内容的提问来源于stack exchange,提问作者soccerway
相关产品推荐
相关产品推荐

