我正在尝试使用相当基本的jQuery.ajax
POST请求从另一台服务器(跨源)调用一台服务器上的Web服务。
return $.ajax({
type: "POST",
url: "http://dev.hostname.com/ws/account/example1@example.com?property_id=1&custnum=123456",
dataType:"json"
});
我总是收到以下error
回复...
XMLHttpRequest无法加载 http://dev.hostname.com/ws/account/example1@example.com?property_id=1&custnum=123456。 No' Access-Control-Allow-Origin'标题出现在请求的上 资源。因此不允许来源
http://localhost:63342
访问。
Web服务是托管在Apache Tomcat/8.0.8
上的基于Java构建的基于Jersey的Web服务。我尝试将请求作为JSONP发送,但在尝试处理promise对象的回调时遇到了问题。那是另一篇文章......作为替代方案,我决定考虑实施CORS Response解决方案。现在我对Java编程非常陌生,对它不太满意所以请耐心等待。
我已经研究了两种实现CORS的主要解决方案。一种是构建自定义响应过滤器。我无法让它工作但后来发现,因为Tomcat 7.0已经提供过滤器了。我已经看到了第二个解决方案的几个帖子,但绝对没有运气。使用Apache Tomcat Documentation中提供的指南,我将以下FILTER信息添加到应用程序的web.xml文件中(我还尝试将其添加到根目录的web.xml中,但它没有在那里工作任一)。
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers, Last-Modified</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
</init-param>
<init-param>
<param-name>cors.support.credentials</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
因为我正在使用Tomcat 8.0.8
。我原以为这会起作用,但我仍然会遇到同样的错误。我错过了什么吗?
感谢您的帮助。
更新
我在Firefox中调用服务时从Firebug添加标头。这是请求标题......
Accept application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Cache-Control no-cache
Connection keep-alive
Content-Length 0
Host dev.hostname.com
Origin http://localhost:63342
Pragma no-cache
Referer http://localhost:63342/keurig/default.html
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
这是响应标题
Content-Length 0
Content-Type text/plain
Date Thu, 21 Aug 2014 17:50:58 GMT
Server Apache-Coyote/1.1
我绝对没有看到任何&#34;访问控制 - *&#34;期望在响应中看到的标题。
答案 0 :(得分:4)
这里提供的CORS配置对我有用,但直到我在最后一个标题中的逗号后面的'Allowed Headers'中删除了空格。
<param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers, Last-Modified</param-value>
一旦我在“Last-Modified”之前取出那个空间,我就开始了。
答案 1 :(得分:0)
在运行Apache Tomcat / 8.0.43的传统Struts 2应用程序中修复此问题的解决方案是在web.xml
配置文件中的Struts 2过滤器之前添加CORS过滤器。