2017-08-30 2 views
1

Ich habe einen Tomcat 9-Server eingerichtet, der meinen API-Code hostet. Es funktioniert gut, wenn ich es vom Postboten anrufe. Ich habe auch die folgenden Filter auf die Tomcat conf/web.xml Datei:

<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> 

ich folgenden jQuery-Code verwenden zum Senden eine GET Anfrage:

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

Es führt den folgenden Fehler:

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

Gibt es irgendetwas, was ich auf der Serverseite mehr tun sollte, um Cross-Origin-Anfragen zuzulassen?

Wie kann ich die obige jQuery-Anfrage ändern, um diesen Fehler loszuwerden?

Viele andere Beiträge haben vorgeschlagen, einen ajax Methodenaufruf mit dataType:"jsonp" zu verwenden? Ist es möglich, diese Modifikation auf die obige $.get Methode zu machen? Wenn nicht, geben Sie bitte ein Beispiel für eine GET und POST, um CORS mit der ajax Methode zu aktivieren.


EDIT

ich auch mit folgenden Konfiguration versucht:

<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> 

... aber es funktioniert immer noch nicht.

+1

Sie setzen den Init-Parameter nicht richtig. Siehe [Dokumente für den CorsFilter] (https://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter). Sie müssen den Init-Parameter 'cors.allowed.origins 'auf die Ursprünge setzen, die Sie zulassen möchten (oder * für alle Ursprünge) –

+0

@peeskillet Bitte beziehen Sie sich auf *** *** EDIT *** in der Frage. Funktioniert immer noch nicht –

Antwort

1

Sie müssen die Header hinzufügen, wenn Sie die Antwort mit Tomcat bearbeiten/erstellen.

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

Antwort auf die Frage Where do I add this:

Sie es hinzufügen, wenn Sie Ihre Antwort für Ihr Servlet vorbereiten (dh die entsprechende Methode, im folgenden Beispiel 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"); 
    } 
} 

Wenn Sie haben kein Servlet implementiert und Sie möchten es über die Konfiguration tun (zB init-parameters). Sie können es vielleicht auch zu Ihren init-Parametern hinzufügen, aber stellen Sie sicher, dass alle dort Header Access-Control-Allow-Origin haben. Access-Control-Allow-Methods, Access-Control-Allow-Headers eingestellt, mit dem entsprechenden Inhalt.

Wenn es immer noch nicht funktioniert, würde es hilfreich sein, die Header zu sehen, die in der Antwort festgelegt sind, um zu bestimmen, welcher Header möglicherweise falsch festgelegt ist.

+0

Wo füge ich das hinzu? –

+0

Ja, das hat funktioniert. Vielen Dank! –

Verwandte Themen