我正在使用 GWT 2.4 构建一个完全在客户端运行并使用我控制但托管在不同服务器上的 Web 服务的应用程序。在这个 Java Servlet Web 服务上,我已经实现了 doOptions,如下所示:
protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "POST, GET");
}
在 GWT 的客户端,我以标准方式提交请求,例如
public static void makeHttpGetRequest(String query, RequestCallback callback) {
String url = "http://example.webservice.com/endpoint" + "?q=" + query;
RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(url));
try {
builder.sendRequest(query, callback);
} catch (RequestException e) {
Window.alert("Server encountered an error: \n" + e.getMessage());
e.printStackTrace();
}
}
然后我的回调像这样实现 onResponseReceived:
@Override
public void onResponseReceived(Request request, Response response) {
if (response.getStatusCode() == 200) {
System.out.println("HTTP request successful, received "
+ response.getText());
processResponse(response.getText());
} else {
System.out.println("HTTP error code " +
response.getStatusCode() + ":" +
response.getStatusText());
}
}
每当我在较新版本的 Chrome 或 Firefox 中运行应用程序并发送请求时,都会调用 onResponseReceived 但响应代码为 0,并且没有错误消息。研究表明,此问题的大多数其他实例都是由 SOP 限制引起的。但是,当我查看 Fiddler 中的 HTTP 流量时,我发现执行此操作时,浏览器确实发送了预期的 HTTP 请求,并且 Web 服务确实返回了预期的响应,响应代码为 200。不知何故,浏览器无法正确处理它。
更新:当我查看 Fiddler 中的流量时,它表明请求已发送并收到响应,但当我在 Chrome 的开发人员控制台中查看相同请求时,它显示该请求已“取消”。如果请求确实发生了,在这种情况下这意味着什么?
有人遇到过这个问题吗?对可能发生的事情有什么建议吗?
最佳答案
错误代码 0 表示 CORS 已中止,请检查您的 servlet 实现是否正常,我认为您必须发送 Allow
而不是 Access-Control-Allow-Methods
,并且您还必须添加 Access-Control-Allow-Headers
,因为 GWT 会向 ajax 请求添加额外的 header 。
从 gwt-query example 尝试这个实现效果很好:
private static final String ALLOWED_DOMAINS_REGEXP = ".*";
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
String origin = req.getHeader("Origin");
if (origin != null && origin.matches(ALLOWED_DOMAINS_REGEXP)) {
resp.addHeader("Access-Control-Allow-Origin", origin);
resp.setHeader("Allow", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS");
if (origin != null) {
String headers = req.getHeader("Access-Control-Request-Headers");
String method = req.getHeader("Access-Control-Request-Method");
resp.addHeader("Access-Control-Allow-Methods", method);
resp.addHeader("Access-Control-Allow-Headers", headers);
resp.setContentType("text/plain");
}
}
不过,我宁愿使用过滤器而不是 servlet,就像在上面的链接中解释的那样。
关于java - CORS 工作的 GWT HTTP 请求响应代码 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15792666/