2

我使用 NetBeans IDE 8.0.1“来自数据库的 RESTful Web 服务”向导将我的表对象映射到 JPA 和 JAX-RS 2.0。创建类后,使用项目选项“Test RESTful Web Services”,NetBeans 自己创建一个接口(HTML、css)。

这在我的本地主机中运行良好。我可以从创建的 Web 服务连接到我的数据库,发送 GET 和 POST (JSON) 请求。

图 1(界面)

现在,我需要从与本地主机不同的另一个域访问,所以我尝试使用 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 请求。

我可以在这里做什么?任何帮助将不胜感激。

4

0 回答 0