java服务器的javascript获取cors错误
我有一个java服务器,在端口8080上使用Glassfish/Jersey库处理RESTful服务(我没有web.xml文件,因为我在console应用程序中托管服务)。我正在端口8081上运行带有ReactJS的webpack开发服务器。在ReactJS控件中,我从RESTful服务发出GET请求。当我打那个电话时,我得到以下错误: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
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从来都不是问题,除非它阻止您编写漏洞。