2017-08-30 30 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

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