与CORS工作GWT HTTP请求响应代码0(GWT HTTP request response c

2019-08-19 07:25发布

我使用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限制出现。 然而,看着小提琴手的HTTP流量,当我看到这是执行时,浏览器确实正在发送预期的HTTP请求,Web服务确实返回预期的响应,有200响应代码。 不知何故,浏览器只是被不正确地处理它。

更新:当我看到在提琴手的交通,则表明该请求被发送和接收到响应,但是当我看到在Chrome的开发者控制台同样的要求则说明该请求被“取消”。 如果请求实际发生的事情,这是什么,在这方面是什么意思?

有没有人碰到这个问题上运行? 什么任何建议,可怎么回事?

Answer 1:

错误代码0意味着CORS已经中止,请检查你的servlet实现所有的权利,我认为你必须发送Allow代替Access-Control-Allow-Methods ,还必须添加的Access-Control-Allow-Headers因为GWT增加了额外的标头Ajax请求。

尝试从这个实现GWT-查询示例工作正常:

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,就像在上面的链接进行了说明,但。



文章来源: GWT HTTP request response code 0 with CORS working