Habilite CORS para aplicaciones tomcat con soporte de credenciales

Tengo una aplicación GWT simple que se ejecuta desde IIS en mi servidor. Estoy tratando de probar las solicitudes HTTP a Tomcat ejecutándose en el mismo servidor. Sin embargo, dado que ambos servidores de aplicaciones se ejecutan en puertos diferentes, mi navegador (Chrome y Firefox) trata las solicitudes como una solicitud CORS.

Para permitir que tomcat acepte la solicitud CORS, la actualicé a Tomcat 7.0.52 y habilité el filtro CORS en la configuración global web.xml. Probé esta configuración simple y parece funcionar. Aquí está el código en 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();
        }

Aquí está el filtro CORS asociado con él:

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

Con esta configuración, recibo una respuesta de 200 OK de tomcat. Por lo tanto, es seguro asumir que el filtro CORS está funcionando. Para respaldar esto, tomé un rastro de violinista y todo se veía bien.

Ahora, dado que quiero acceder a una de las aplicaciones de tomcat (solr), necesito autenticación básica con mi solicitud CORS. Esto trae una solicitud de verificación previa en la imagen. Desde que configuré mi filtro CORS para permitir el uso de credenciales, no necesité ningún cambio. Entonces, hice el siguiente cambio en mi código

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

Ahora, cuando trato de usar este código, se mete dentro delonResponseReceived bloque de código y da un cuadro de alerta con el valor "0". Cuando tomé un rastro de violinista, obtuve esto:

Tiene sentido que el navegador envíe una solicitud de verificación previa ya que estoy agregando el encabezado personalizado a la solicitud. Pero no entiendo por qué Tomcat responde con un código 401 a pesar de agregar el encabezado de autorización a su configuración de filtro CORS.

Agradecería cualquier ayuda o respuesta

EDITAR: Una cosa más que he notado: si mi URL es solo "bavarians: 8080 / solr /" ;, tomcat autoriza con éxito la solicitud con verificación previa y la siguiente solicitud inmediata se procesa como una solicitud GET normal con una respuesta de 200 OK. Pero si ingreso el nombre de la función y hago una consulta con la URL, obtengo 401 nuevamente. Acceder a la URL anterior desde el navegador requiere autenticación básica. EntoncesCORSFilter funciona hasta cierto punto

Respuestas a la pregunta(1)

Su respuesta a la pregunta