完成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
//
}
你知道为什么会发生这种异常吗?
答案 0 :(得分:1)
这是因为在这里您只为选项请求添加标题。
但实际上POST失败了。
要解决问题,最好是在应用程序中添加一个CORS过滤器,该过滤器将应用于所有请求。
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;
}
}