2017-08-30 32 views
1

我建立了托管我的API代码的Tomcat 9服务器。当我从邮递员打电话时它工作正常。我还增加了以下过滤器到Tomcat conf/web.xml文件:

<filter> 
<filter-name>CorsFilter</filter-name> 
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class> 
<init-param> 
<param-name>cors.exposed.headers</param-name> 
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value> 
</init-param> 
</filter> 

我使用下面的jQuery代码发送GET要求:

$(document).ready(function() 
{ 
    $.get("http://localhost:8080/myapp/webapp/cars", function(data, status){ 
     alert("Data: " + data + "\nStatus: " + status); 
}); 

它引发以下错误:

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

有什么我应该做更多的服务器端允许跨源请求?

如何修改上面的jQuery要求摆脱这种错误的?

许多其他职位都建议使用具有dataType:"jsonp"ajax方法调用?有没有可能以某种方式对上述$.get方法进行修改?如果没有,请举例GETPOST以使用ajax方法启用CORS。


编辑

我也试图与以下配置:

<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</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> 
<init-param> 
<param-name>cors.preflight.maxage</param-name> 
<param-value>10</param-value> 
</init-param> 
</filter> 
<filter-mapping> 
<filter-name>CorsFilter</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 

...但它仍然没有工作。

+1

你没有正确设置init-param。查看[CorsFilter的文档](https://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter)。你需要将'cors.allowed.origins'的init-参数组您要允许(或*对所有来源) –

+0

@peeskillet请参阅*** ***编辑在问题的起源。仍然不能正常工作 –

回答

1

你必须处理/创建在Tomcat的响应时添加标题。

response.setHeader("Access-Control-Allow-Origin", "*"); 
response.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS"); 
response.setHeader("Access-Control-Allow-Headers", "Content-Type"); 

回答这个问题Where do I add this

你加它,当你准备为你的servlet响应(即适当的方法,在下面的例子中POST):

public class MyServlet extends HttpServlet { 

    @Override 
    public void doPost(final HttpServletRequest request, 
         final HttpServletResponse response) throws ServletException { 
     response.setHeader("Access-Control-Allow-Origin", "*"); 
     response.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS"); 
     response.setHeader("Access-Control-Allow-Headers", "Content-Type"); 
    } 
} 

如果你没有实现的任何servlet和你想通过配置(例如,init-parameters),你可能也可以将其添加到您的初始化参数,但要确保让所有有头标Access-Control-Allow-Origin做到这一点, Access-Control-Allow-MethodsAccess-Control-Allow-Headers设置,具有适当的内容。

如果仍然没有工作,这将有助于地看到,在响应中设置的头,以确定哪些头可能设置不正确。

+0

我该在哪里添加? –

+0

是的,工作。非常感谢你! –