在tomcat中执行angular 2 post时的ClientAbortException

时间:2016-03-30 13:36:48

标签: tomcat7 angular resteasy

完成angular 2应用程序的快速入门后,我试图对另一台服务器(tomcat)中部署的其他Web服务执行帖子。 我添加了一个OPTIONS方法来允许所有来源。从getOptions()方法返回后,它进入getTestResponse方法和a 发生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
//
}

你知道为什么会发生这种异常吗?

1 个答案:

答案 0 :(得分:1)

这是因为在这里您只为选项请求添加标题。

但实际上POST失败了。

要解决问题,最好是在应用程序中添加一个CORS过滤器,该过滤器将应用于所有请求。

CorsFilterApi

SelectedValueBinding

编辑:

解决方案2仅将标头应用于您的帖子请求和 确保你的@OPTION请求不包含@PATH 因为那样你的情况就不一样了:

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;
    }
}