GWTTestCase - HTMLUnit - 不允许"访问控制 - 允许 - 来源"

时间:2015-01-05 05:28:06

标签: gwt junit htmlunit restlet

当运行使用GWT调用外部Restful服务的GWTTestCase时(使用Restlet-GWT),应用程序会抛出以下错误。

错误:

Jan 05, 2015 1:24:41 PM com.gargoylesoftware.htmlunit.javascript.background.JavaScriptJobManagerImpl runSingleJob
SEVERE: Job run failed with unexpected RuntimeException: Wrapped java.lang.RuntimeException: No permitted "Access-Control-Allow-Origin" header.
net.sourceforge.htmlunit.corejs.javascript.WrappedException: Wrapped java.lang.RuntimeException: No permitted "Access-Control-Allow-Origin" header.
    at net.sourceforge.htmlunit.corejs.javascript.Context.throwAsScriptRuntimeEx(Context.java:1889)
    at com.gargoylesoftware.htmlunit.javascript.host.xml.XMLHttpRequest.doSend(XMLHttpRequest.java:681)
    at com.gargoylesoftware.htmlunit.javascript.host.xml.XMLHttpRequest.access$000(XMLHttpRequest.java:94)
    at com.gargoylesoftware.htmlunit.javascript.host.xml.XMLHttpRequest$1.run(XMLHttpRequest.java:603)
    at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:602)
    at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
    at com.gargoylesoftware.htmlunit.javascript.background.JavascriptXMLHttpRequestJob.run(JavascriptXMLHttpRequestJob.java:36)
    at com.gargoylesoftware.htmlunit.javascript.background.JavaScriptJobManagerImpl.runSingleJob(JavaScriptJobManagerImpl.java:328)
    at com.gargoylesoftware.htmlunit.javascript.background.DefaultJavaScriptExecutor.run(DefaultJavaScriptExecutor.java:162)
    at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.RuntimeException: No permitted "Access-Control-Allow-Origin" header.
    ... 9 more

根据我的研究,这似乎是HTMLUnit不允许访问跨域的问题,是否有解决方法?

2 个答案:

答案 0 :(得分:2)

您可以将CORS的支持添加到您的应用程序中。

在Restlet框架的2.3版本中提供了支持(参见http://restlet.com/technical-resources/restlet-framework/guide/2.3/introduction/whats-new/2.3)。 如果您使用的是2.2版本,并且由于我们无法将此功能添加到2.2,您可以手动在自己的代码中添加所需的类(cf https://github.com/restlet/restlet-framework-java/blob/2.3/modules/org.restlet/src/org/restlet/service/CorsService.javahttps://github.com/restlet/restlet-framework-java/blob/2.3/modules/org.restlet/src/org/restlet/engine/application/CorsFilter.java和{{ 3}})。

答案 1 :(得分:2)

我被这个相同的错误响应所困扰,但我无法将Restlet框架重构为我的客户端&服务器代码库。

处理问题诊断的几个技巧。

  1. 使用代理或检查开发工具来记录OPTIONS和GET / POST对的请求和响应中的确切标题。
  2. OPTIONS请求标题" Origin"必须匹配响应标头" Access-Control-Allow-Origin"究竟。没有通配符。也许写下您的回复只是回应请求,如:

    response.addHeader(" Access-control-allow-origin&#34 ;, request.getHeader(" Origin"));

  3. 您的请求标题名称必须在OPTIONS" Access-control-request-headers"中完全枚举。标题值并匹配" Access-control-Allow-Headers"响应标题。

  4. 注意:#3中的不匹配将触发与#2中不匹配相同的错误消息。