原因:即使在java资源中明确指定,CORS标题“Access-Control-Allow-Origin”也会丢失

时间:2017-11-14 18:59:29

标签: java angular tomcat jersey cors

我在两个不同的端口上测试我的后端(在tomcat服务器上使用Jersey的Java)和使用webpack服务的前端(Angular 4),因此我得到了一个cors访问控制源块。对于我的get方法,一切正常,所有请求的数据都可以在UI上找到。现在我正在测试我的POST方法,并且我在标题中不断收到相同的消息。

我的post方法应该保留发送给它的数据,并返回一个包含新持久化实体位置的响应。

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response persistAccountLocation(AccountLocation entity) throws URISyntaxException {


    accountLocationService.persist(entity);

    JsonObject object = Json.createObjectBuilder()
            .add("location", "api/v1/accounts_locations/"+entity.getLocation_id()).build();

    return Response.status(Response.Status.CREATED)// 201
            .entity("Location created")
            .header("Access-Control-Allow-Origin","*")
            .header("Access-Control-Allow-Methods", "POST,GET,PUT,DELETE")
            .allow("OPTIONS")
            .entity(object.toString()).build();
}

在firefox浏览器的网络选项卡中,我只看到状态为200的OPTIONS

Host: localhost:8081
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: POST
Access-Control-Request-Headers: access-control-allow-origin,content-type
Origin: http://localhost:4200
Connection: keep-alive

但在那之后这个帖子永远不会发生。我假设CORS在那时阻止了它。除了资源类之外,还有其他地方我应该允许访问控制吗?我已经读过,典型的所有CORS配置都是在服务器端完成的。完全迷失了。任何反馈意见

修改

public class CORSResponseFilter
implements ContainerResponseFilter {

    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
            throws IOException {

        MultivaluedMap<String, Object> headers = responseContext.getHeaders();

        headers.add("Access-Control-Allow-Origin", "*");    
        headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS");         
        headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type,");
    }

}

我制作了一个经过轻微调整的过滤器并将其注册到我的应用

public class JaxRsApplication extends ResourceConfig{
    public JaxRsApplication() {

        //  register application resources - unmapped resources will throw exception
        register(AccountLocationResource.class);

        register(CORSResponseFilter.class);
    }

1 个答案:

答案 0 :(得分:0)

How to handle CORS using JAX-RS with Jersey stackoverflow问题中提供了一个很好的答案。

您已获得Jersey 1的链接,但请确保您使用的是哪个版本。

这样你就不用写了

        .header("Access-Control-Allow-Origin","*")
        .header("Access-Control-Allow-Methods", "POST,GET,PUT,DELETE")
        .allow("OPTIONS")

每个请求。过滤器将为您应用选项。

我注意到的另一件事

return Response.status(Response.Status.CREATED)// 201
        .entity("Location created") // <- entity() call here
        .header("Access-Control-Allow-Origin","*")
        .header("Access-Control-Allow-Methods", "POST,GET,PUT,DELETE")
        .allow("OPTIONS")
        .entity(object.toString()).build(); // <- one more entity() call here (not sure what effect it may have)