在 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 过滤器,它将应用于所有请求。
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();
}
完成 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 过滤器,它将应用于所有请求。
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();
}