Java 如何在Maven中为跨域POST请求激活CORS筛选器?

Java 如何在Maven中为跨域POST请求激活CORS筛选器?,java,http,cors,Java,Http,Cors,我将一个React应用程序部署到一个单独的Google应用程序引擎,该引擎发送一个POST请求,从一个Web应用程序中获取一些数据,我正在尝试解析React应用程序中的数据。我能够从邮递员那里获取正确的数据,但在请求的资源错误上,相同的请求不断给我一个“访问控制允许来源”头。 我目前收到来自更大的Web应用程序的PostRequest,如下所示: @POST @Path("/initializer") @Produces(MediaType.APPLICATION_JSON) @Consumes

我将一个React应用程序部署到一个单独的Google应用程序引擎,该引擎发送一个POST请求,从一个Web应用程序中获取一些数据,我正在尝试解析React应用程序中的数据。我能够从邮递员那里获取正确的数据,但在请求的资源错误上,相同的请求不断给我一个“访问控制允许来源”头。 我目前收到来自更大的Web应用程序的PostRequest,如下所示:

@POST
@Path("/initializer")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String getOrCreateSeller(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {

    this.shopifyStoreName = body.get("id").toString();
    long hashedName = hashStoreName();
    SellerId sellerId = new SellerId(hashedName);
    try {
        Seller seller = sellerService.findSellerById(sellerId);
        getStore(seller);
        String json = getResponseJson();
        return Response.ok(json, MediaType.APPLICATION_JSON).build();
    } catch (NotFoundException e) {
        Seller seller = new Seller(sellerId.toDatastoreId(), 
     this.shopifyStoreName, 3L);
        datastoreRepository.transact(() -> {
            sellerValidator.validate(seller);
            sellerRepository.save(seller);
        });
        createStore(seller);
        String json = getResponseJson();
        Response.ResponseBuilder r = Response.ok(json, MediaType.APPLICATION_JSON);
        return r.build();
    }
}
public class CORSFilter implements Filter {

@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,
        ServletException {
    HttpServletResponse httpResp = (HttpServletResponse) resp;
    HttpServletRequest httpReq = (HttpServletRequest) req;

    httpResp.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS");
    httpResp.setHeader("Access-Control-Allow-Origin", "*");
    if (httpReq.getMethod().equalsIgnoreCase("OPTIONS")) {
        httpResp.setHeader("Access-Control-Allow-Headers",
                httpReq.getHeader("Access-Control-Request-Headers"));
    }
    chain.doFilter(req, resp);
}

@Override
public void init(FilterConfig arg0) throws ServletException {
}

@Override
public void destroy() {
}
事实证明,在我从中获取数据的更大的Web应用程序中,包含一个CORSFilter类,如下所示:

@POST
@Path("/initializer")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String getOrCreateSeller(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {

    this.shopifyStoreName = body.get("id").toString();
    long hashedName = hashStoreName();
    SellerId sellerId = new SellerId(hashedName);
    try {
        Seller seller = sellerService.findSellerById(sellerId);
        getStore(seller);
        String json = getResponseJson();
        return Response.ok(json, MediaType.APPLICATION_JSON).build();
    } catch (NotFoundException e) {
        Seller seller = new Seller(sellerId.toDatastoreId(), 
     this.shopifyStoreName, 3L);
        datastoreRepository.transact(() -> {
            sellerValidator.validate(seller);
            sellerRepository.save(seller);
        });
        createStore(seller);
        String json = getResponseJson();
        Response.ResponseBuilder r = Response.ok(json, MediaType.APPLICATION_JSON);
        return r.build();
    }
}
public class CORSFilter implements Filter {

@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,
        ServletException {
    HttpServletResponse httpResp = (HttpServletResponse) resp;
    HttpServletRequest httpReq = (HttpServletRequest) req;

    httpResp.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS");
    httpResp.setHeader("Access-Control-Allow-Origin", "*");
    if (httpReq.getMethod().equalsIgnoreCase("OPTIONS")) {
        httpResp.setHeader("Access-Control-Allow-Headers",
                httpReq.getHeader("Access-Control-Request-Headers"));
    }
    chain.doFilter(req, resp);
}

@Override
public void init(FilterConfig arg0) throws ServletException {
}

@Override
public void destroy() {
}
}


因此,我觉得应该使用这个类来启用CORs,但我不确定如何启用。请帮忙

由于您的服务器端代码似乎在使用JAX-RS,按照您的CORSFilter的相同规则将CORS头添加到JAX-RS应用程序的方法就是将此类添加到您的应用程序中:

@Provider
@Priority(Priorities.HEADER_DECORATOR)
public class AccessControlResponseFilter implements ContainerResponseFilter {
    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        final MultivaluedMap<String,Object> headers = responseContext.getHeaders();

        headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS");
        headers.add("Access-Control-Allow-Origin", "*");
        if (requestContext.getMethod().equalsIgnoreCase("OPTIONS")) {
            headers.add("Access-Control-Allow-Headers", requestContext.getHeaderString("Access-Control-Request-Headers"));
        }
    }
}

从两个解决方案中选择一个,而不是两个。

您可以在控制器类中使用@CrossOrigin注释。若要使用第二种解决方案,我必须扩展我提供的CORSFilter,对吗?不太可能。CORSFilter只需存在于您将其添加到web.xml的应用程序中即可。我的hub中似乎有5+个web.xml,其中一些确实包含CORSFilter映射,但我仍然会遇到相同的错误。然后,我尝试将您向我展示的第一个类添加到我的中心,但这并没有什么不同。但是,我可以通过在禁用web安全性的浏览器中启动所有内容来绕过此错误。您必须将其添加到.war文件的web.xml中,该文件包含方法为getOrCreateSeller的类