在 tomcat 中执行 angular 2 post 时出现 ClientAbortException

ClientAbortException when executing angular 2 post in tomcat

完成 angular 2 应用程序的快速入门后,我尝试对部署在另一台服务器 tomcat 上的其余 Web 服务执行 post。 我添加了一个 OPTIONS 方法以允许所有来源。从 getOptions() 方法返回后,它进入 getTestResponse 方法和一个 发生 ClientAbortException。

示例代码:

return this._http.post(url, body, options)
            .map(res => res.json());

网络服务代码:

@OPTIONS
@Path("samplePath")
public Response getOptions() {
return Response.ok()
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT")
.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding")
.build();
}

@POST
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public TestResponse getTestResponse(TestRequest testRequest) {

//somehow get response from database
//
}

您知道为什么会发生此异常吗?

这是因为您在此处添加 headers 只是您的选项请求。

但实际上 POST 失败了。

要解决问题,最好的办法是向您的应用程序添加一个 CORS 过滤器,它将应用于所有请求。

CorsFilterApi

import org.jboss.resteasy.plugins.interceptors.CorsFilter;

@ApplicationPath(RestApplication.ROOT_PATH)
public class RestApplication extends Application {

    public static final String ROOT_PATH = "/resources";

    private Set<Object> singletons = new HashSet<>();


    ...



    @Override
    public Set<Object> getSingletons() {

        CorsFilter corsFilter = new CorsFilter();
        corsFilter.getAllowedOrigins().add("*");
        corsFilter.setAllowCredentials(true);
        corsFilter.setAllowedHeaders("origin, content-type, accept, authorization");
        corsFilter.setAllowedMethods("GET, POST, DELETE, PUT, OPTIONS, HEAD");
        singletons.add(corsFilter);

        return singletons;
    }
}

编辑:

解决方案 2 headers 仅适用于您的 post 请求,并且 确保您的@OPTION REQUEST IS NOT CONTAINING @PATH 因为在你的情况下它不是同一个请求:

@OPTIONS
public Response getOptions() {
return Response.ok()
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT")
.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding")
.build();
}

@POST
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public Response getTestResponse(TestRequest testRequest) {

  return Response.ok()
        .header("Access-Control-Allow-Origin", "*")
        .header("Access-Control-Allow-Headers", "origin, content-type, accept, authorization")
        .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS").build();
}