我使用 NetBeans IDE 8.0.1“来自数据库的 RESTful Web 服务”向导将我的表对象映射到 JPA 和 JAX-RS 2.0。创建类后,使用项目选项“Test RESTful Web Services”,NetBeans 自己创建一个接口(HTML、css)。
这在我的本地主机中运行良好。我可以从创建的 Web 服务连接到我的数据库,发送 GET 和 POST (JSON) 请求。
现在,我需要从与本地主机不同的另一个域访问,所以我尝试使用 CORS。搜索不同的帖子我使用了这个代码:
package CORS;
import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.container.PreMatching;
import javax.ws.rs.ext.Provider;
@Provider
@PreMatching
public class CORSResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext request, ContainerResponseContext response) throws IOException {
response.getHeaders().add("Access-Control-Allow-Origin", "*");
response.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
response.getHeaders().add("Access-Control-Allow-Credentials", "true");
response.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
}
}
创建了这个 ApplicationConfig 类后,添加了资源 (CORSRequestFilter):
package entities.service;
import java.util.Set;
import javax.ws.rs.core.Application;
@javax.ws.rs.ApplicationPath("webresources")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new java.util.HashSet<>();
addRestResourceClasses(resources);
return resources;
}
private void addRestResourceClasses(Set<Class<?>> resources) {
resources.add(CORS.CORSResponseFilter.class);
resources.add(entities.service.AppSettingsFacadeREST.class);
resources.add(entities.service.CategoryFacadeREST.class);
resources.add(entities.service.CityFacadeREST.class);
resources.add(entities.service.EmailInitialSubscriptionFacadeREST.class);
resources.add(entities.service.IdentityProviderFacadeREST.class);
resources.add(entities.service.ItemFacadeREST.class);
resources.add(entities.service.ItemHistoryFacadeREST.class);
resources.add(entities.service.ItemStatusFacadeREST.class);
resources.add(entities.service.PhotoFacadeREST.class);
resources.add(entities.service.UserFacadeREST.class);
resources.add(entities.service.WantedItemsFacadeREST.class);
}
}
它可以完美运行一段时间!我能够使用 RESTful Web 服务从另一个域将我的数据库连接到我的 Glassfish 服务器。我什至开发了一个 AngularJS 应用程序,也可以使用 RSWebServices。
然后我开始收到此错误:
XMLHttpRequest cannot load http://xx.x.xxx.xx:8080/freeproject/webresources/entities.emailinitialsubscription. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://xxxxxxxxxxx.com' is therefore not allowed access. The response had HTTP status code 400.
预检请求返回状态 200 OK。但是 POST 请求失败。
在互联网上搜索我发现 Oracle 本身https://blogs.oracle.com/theaquarium/entry/supporting_cors_in_jax_rs告诉我关注这篇文章: http: //www.developerscrappad.com/1781/java/java-ee/rest- jax-rs/java-ee-7-jax-rs-2-0-cors-on-rest-how-to-make-rest-apis-accessible-from-a-different-domain/
所以,我尝试了一下,并添加了一个新类:resources.add(CORS.CORSRequestFilter.class):
package CORS;
import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.PreMatching;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;
@Provider
@PreMatching
public class CORSRequestFilter implements ContainerRequestFilter {
@Override
public void filter( ContainerRequestContext requestCtx ) throws IOException {
String path = requestCtx.getUriInfo().getPath();
// IMPORTANT!!! First, Acknowledge any pre-flight test from browsers for this case before validating the headers (CORS stuff)
if ( requestCtx.getRequest().getMethod().equals( "OPTIONS" ) ) {
requestCtx.abortWith( Response.status( Response.Status.OK ).build() );
}
}
}
但它不起作用。abortWith 函数停止请求链,并且永远不会发送 POST 请求。
我可以在这里做什么?任何帮助将不胜感激。