GWT HTTP请求响应代码0,CORS正在工作
我正在使用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请求添加了额外的标头。
从gwt-query示例中尝试此实现,该示例正常工作:
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"); } }
我宁愿使用filter而不是servlet,就像在上面的链接中解释的那样。
- 如何在Spring启动时在Spring Security级别启用CORS
- 使用Java Config的全局CORS配置不起作用
- CORSfilter未按预期工作
- 使用Spring Framework为OPTIONS请求启用CORS
- 这个CORS处理程序安全吗?
- 即使存在所有CORS标头,也会出现跨源资源共享问题
- 如何将Cross Origin资源共享与Spring MVC 4.0.0 RESTful Webservice集成
- Spring Security的跨源资源共享
- 使用application / json contentType的AJAX POST调用获取“no’Access-Control-Allow-Origin’标头”错误