具有CORS工作的GWT HTTP请求响应代码0

时间:2013-04-03 16:18:15

标签: java http gwt cors same-origin-policy

我正在使用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的开发者控制台中查看相同的请求时,它会显示请求已“取消”。如果请求实际发生,那在这种情况下意味着什么?

有没有人遇到过这个问题?有关可能发生的事情的任何建议吗?

1 个答案:

答案 0 :(得分:1)

错误代码0表示CORS已中止,检查您的servlet实现是否正常,我认为您必须发送Allow而不是Access-Control-Allow-Methods,并且您还必须添加{ {1}}因为GWT会向ajax请求添加额外的标头。

gwt-query example尝试此实现,效果很好:

Access-Control-Allow-Headers

我宁愿使用过滤器而不是servlet,就像在上面的链接中解释的那样。