POST请求不使用CORS(Java EE7,Glassfish 4.1,JAX-RS 2.0)

时间:2015-06-24 17:47:41

标签: netbeans cors java-ee-7 glassfish-4.1

我使用了NetBeans IDE 8.0.1和#34;数据库中的RESTful Web服务"向导用JPA和JAX-RS 2.0映射我的表对象。 创建类后,使用项目选项"测试RESTful Web服务",NetBeans本身创建一个接口(HTML,css)。

这在我的localhost中工作正常。我可以从创建的Web服务连接到我的数据库,发送GET和POST(JSON)请求。

Image 1 (Interface)

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

我可以在这做什么?任何帮助将受到高度赞赏。

0 个答案:

没有答案