java服务器的javascript获取cors错误

java服务器的javascript获取cors错误,javascript,java,rest,reactjs,Javascript,Java,Rest,Reactjs,我有一个java服务器,在端口8080上使用Glassfish/Jersey库处理RESTful服务(我没有web.xml文件,因为我在console应用程序中托管服务)。我正在端口8081上运行带有ReactJS的webpack开发服务器。在ReactJS控件中,我从RESTful服务发出GET请求。当我打那个电话时,我得到以下错误: Fetch API cannot load http://localhost:8080/realtime/initialize. Response to pre

我有一个java服务器,在端口8080上使用Glassfish/Jersey库处理RESTful服务(我没有web.xml文件,因为我在console应用程序中托管服务)。我正在端口8081上运行带有ReactJS的webpack开发服务器。在ReactJS控件中,我从RESTful服务发出GET请求。当我打那个电话时,我得到以下错误:

Fetch API cannot load http://localhost:8080/realtime/initialize. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8081' is therefore not allowed access. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
这是javascript代码:

fetch('http://localhost:8080/realtime/initialize', {
        method: "GET",
        headers: {
            mode: 'cors',
        } 
    })
    .then(function(response) {
        console.log("financial services initialization ok");
        this.setState({loginState: 1});
    }).catch(function(err) {
        console.log("financial services initialization error: " + err);
        alert("initialized failed");
    });
这是我的java类:

package Application.Server;

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import Application.Server.Contracts.GeneralResult;

@Path("/realtime")
public class RealTimeServices {
    private int count = 1;

    @GET
    @Path("/initialize")
    @Produces(MediaType.APPLICATION_JSON)
    public GeneralResult initializeAccount() {
        outputService.showMessage("connecting attempt: " + count);          
        count ++;           
        return new GeneralResult("request made");
    }
}
我不确定问题是什么——我认为cors是一个浏览器安全问题,但不明白处理cors意味着什么。我试图修复它失败了

我已经尝试将“访问控制允许源代码”添加到javascript http调用中,但仍然会抛出一个错误,并且我没有返回结果

看起来我需要在java代码中做一些更改,但是如果javascript中有什么可以更改的,我会很高兴

多谢各位
Matt

此web服务需要一个请求处理程序来处理。这些标准试图使禁用诸如同源策略(SOP)之类的关键安全功能变得困难,因此您必须非常有意地公开哪些功能


在这个特定的API调用中,看起来不需要响应。我不确定您为什么要破坏SOP。

此web服务需要一个请求处理程序来处理该SOP。这些标准试图使禁用诸如同源策略(SOP)之类的关键安全功能变得困难,因此您必须非常有意地公开哪些功能


在这个特定的API调用中,看起来不需要响应。我不确定您为什么要破坏SOP。

我通过向grizzly服务器实例添加响应过滤器解决了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.core.MultivaluedMap;
import javax.ws.rs.ext.Provider;

import com.google.inject.Singleton;

@Singleton
@Provider
public class ServerResponses implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
            throws IOException {
        MultivaluedMap<String, Object> headers = responseContext.getHeaders();

        headers.add("Access-Control-Allow-Origin", "*");
        headers.add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
        headers.add("Access-Control-Allow-Credentials", "true");
        headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");       

    }

}
我的答案基于这篇文章。正如@rook所指出的,这可能是一个不安全的解决方案。它适用于我,因为我不会部署我的服务器

多谢各位
Matt

我通过向grizzly服务器实例添加响应过滤器解决了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.core.MultivaluedMap;
import javax.ws.rs.ext.Provider;

import com.google.inject.Singleton;

@Singleton
@Provider
public class ServerResponses implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
            throws IOException {
        MultivaluedMap<String, Object> headers = responseContext.getHeaders();

        headers.add("Access-Control-Allow-Origin", "*");
        headers.add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
        headers.add("Access-Control-Allow-Credentials", "true");
        headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");       

    }

}
我的答案基于这篇文章。正如@rook所指出的,这可能是一个不安全的解决方案。它适用于我,因为我不会部署我的服务器

多谢各位
Matt

您需要从web服务启用CORS。@TimothyKanski您知道怎么做吗?我不是java开发人员,但可能是:@TimothyKanski。thnx。我理解。我没有使用spring io。我正在控制台应用程序中使用grizzly。显然,我选择了一条不寻常的路径来托管我的RESTful服务。这个呢?您需要从web服务启用CORS。@TimothyKanski您知道怎么做吗?我不是java开发人员,但可能是:@TimothyKanski。thnx。我理解。我没有使用spring io。我正在控制台应用程序中使用grizzly。显然,我选择了一条不寻常的路径来托管我的RESTful服务。这个呢?为了使代码尽可能简洁,我故意省略了所有的逻辑。请假设我需要修复cors/SOP问题。@tatmanblue然后请假设您需要一个
OPTIONS
飞行前请求处理程序。我知道一个绝对的事实,如果你不需要阅读回复,那么你就不需要CORS。这就是跨站点请求伪造(CSRF)的要点,我经常利用这一点。SOP从来都不是问题,除非它阻止您编写漏洞攻击。我故意省略了所有逻辑,以便使代码尽可能简洁。请假设我需要修复cors/SOP问题。@tatmanblue然后请假设您需要一个
OPTIONS
飞行前请求处理程序。我知道一个绝对的事实,如果你不需要阅读回复,那么你就不需要CORS。这就是跨站点请求伪造(CSRF)的要点,我经常利用这一点。SOP从来都不是问题,除非它阻止您编写漏洞。