Aktivieren Sie CORS für Tomcat-Anwendungen mit Unterstützung für Anmeldeinformationen

Ich habe eine einfache GWT-Anwendung, die von IIS auf meinem Server ausgeführt wird. Ich versuche, HTTP-Anforderungen an Tomcat zu testen, die auf demselben Server ausgeführt werden. Da jedoch beide Anwendungsserver auf unterschiedlichen Ports ausgeführt werden, behandelt mein Browser (Chrome und Firefox) die Anforderungen als CORS-Anforderung.

Damit Tomcat CORS-Anforderungen akzeptieren kann, habe ich es auf Tomcat 7.0.52 aktualisiert und den CORS-Filter in der globalen web.xml-Konfiguration aktiviert. Ich habe dieses einfache Setup getestet und es scheint zu funktionieren. Hier ist der Code in GWT:

        String url = "http://bavarians:8080/";
        RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, url);
        box.setText(url);
        try
        {
            rb.sendRequest("", new RequestCallback(){

                @Override
                public void onResponseReceived(Request request, Response response)
                {
                    Window.alert(response.getStatusCode() + response.getStatusText());
                }

                @Override
                public void onError(Request request, Throwable exception)
                {
                    Window.alert("Request failed");

                }});
        }
        catch (RequestException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Hier ist der damit verbundene CORS-Filter:

<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>http://bavarians</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, Authorization</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials, Authorization</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>

Mit diesem Setup erhalte ich eine 200-OK-Antwort von Tomcat. Man kann also davon ausgehen, dass der CORS-Filter funktioniert. Um das zu belegen, habe ich eine Fiedlerspur genommen und alles sah gut aus.

Da ich nun auf eine der Apps von tomcat (solr) zugreifen möchte, benötige ich eine Basisauthentifizierung mit meiner CORS-Anfrage. Dies bringt eine Preflight-Anfrage ins Bild. Da ich meinen CORS-Filter so eingerichtet habe, dass er die Verwendung von Anmeldeinformationen ermöglicht, mussten keine Änderungen daran vorgenommen werden. Daher habe ich meinen Code wie folgt geändert

        String url = "http://bavarians:8080/solr/select?wt=xml&q=tag_name:abcd&username=domain\\userid";
        RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, url);
        box.setText(url);
        rb.setHeader("Authorization", "Basic YWRtaW46YWRtaW4=");
        rb.setIncludeCredentials(true);

Wenn ich jetzt versuche, diesen Code zu verwenden, gelangt er in dieonResponseReceived&nbsp;Codeblock und gibt eine Warnmeldung mit dem Wert "0" aus. Wenn ich eine Fiedlerspur gemacht habe, bekomme ich Folgendes:

Es ist sinnvoll, dass der Browser eine Preflight-Anfrage sendet, da ich der Anfrage den benutzerdefinierten Header hinzufüge. Aber ich verstehe nicht, warum Tomcat mit einem 401-Code antwortet, obwohl der Berechtigungsheader zu seiner CORS-Filterkonfiguration hinzugefügt wurde.

Ich würde mich über jede Hilfe oder Antwort freuen

BEARBEITEN:&nbsp;Eine weitere Sache, die mir aufgefallen ist: Wenn meine URL nur "bavarians: 8080 / solr /" ist, autorisiert Tomcat die vorgeprüfte Anfrage erfolgreich und die sofortige nächste Anfrage wird als normale GET-Anfrage mit einer 200-OK-Antwort verarbeitet. Aber wenn ich den Funktionsnamen und die Abfrage mit der URL eingebe, erhalte ich erneut 401. Für den Zugriff auf die oben genannte URL über den Browser ist eine Standardauthentifizierung erforderlich. DamitCORSFilter&nbsp;funktioniert bis zu einem gewissen Punkt