java dropwizard

java - dropwizard metrics



Habilitar cors en dropwizard no funciona (3)

Agregando a la respuesta de Mike Clarke:

Establecer CHAIN_PREFLIGHT_PARAM en falso permitirá que este filtro maneje las solicitudes de verificación previa sin que los filtros de autenticación intercepten lo que sería una respuesta 200 y los convierta en no autorizados / prohibidos.

import org.eclipse.jetty.servlets.CrossOriginFilter; import javax.servlet.DispatcherType; import java.util.EnumSet; public void run(Configuration conf, Environment environment) { // Enable CORS headers final FilterRegistration.Dynamic cors = environment.servlets().addFilter("CORS", CrossOriginFilter.class); // Configure CORS parameters cors.setInitParameter("allowedOrigins", "*"); cors.setInitParameter("allowedHeaders", "X-Requested-With,Content-Type,Accept,Origin"); cors.setInitParameter("allowedMethods", "OPTIONS,GET,PUT,POST,DELETE,HEAD"); // Add URL mapping cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); // DO NOT pass a preflight request to down-stream auth filters // unauthenticated preflight requests should be permitted by spec cors.setInitParameter(CrossOriginFilter.CHAIN_PREFLIGHT_PARAM, Boolean.FALSE.toString()); }

Me sorprendió que no encontré ningún ejemplo en las redes que incluyeran esta configuración. Pasé unos días tratando de resolver esto.

Estoy trabajando en una aplicación dropwizard y js ui para interactuar con la api. Necesito cargar datos json para actualizar las vistas, pero antes tengo que habilitar Cors en Dropwizard. Hice algo de personal pero parece que no funciona porque dropwizard siempre devuelve 204 sin contenido.

@Override public void run(final BGConfiguration configuration, final Environment environment) throws Exception { final Map<String, String> params = new HashMap<>(); params.put("Access-Control-Allow-Origin", "/*"); params.put("Access-Control-Allow-Credentials", "true"); params.put("Access-Control-Expose-Headers", "true"); params.put("Access-Control-Allow-Headers", "Content-Type, X-Requested-With"); params.put("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); environment.servlets().addFilter("cors", CrossOriginFilter.class).setInitParameters(params); }


El error aquí es que el filtro no se ha configurado con una ruta URL a través del método addMappingForUrlPatterns .

Esto me funcionó usando dropwizard 0.7.1:

import org.eclipse.jetty.servlets.CrossOriginFilter; import javax.servlet.DispatcherType; import java.util.EnumSet; public void run(Configuration conf, Environment environment) { // Enable CORS headers final FilterRegistration.Dynamic cors = environment.servlets().addFilter("CORS", CrossOriginFilter.class); // Configure CORS parameters cors.setInitParameter("allowedOrigins", "*"); cors.setInitParameter("allowedHeaders", "X-Requested-With,Content-Type,Accept,Origin"); cors.setInitParameter("allowedMethods", "OPTIONS,GET,PUT,POST,DELETE,HEAD"); // Add URL mapping cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); }

Supongo que está probando esto en vivo en un navegador, pero puede verificarlo a través de CLI con un comando curl como este:

$ curl -H "Origin: http://example.com" / -H "Access-Control-Request-Method: POST" / -H "Access-Control-Request-Headers: X-Requested-With" / -X OPTIONS --verbose / http://localhost:8080

Debería ver un montón de encabezados HTTP Access-Control-* en la respuesta.


Para mí, incluso después de configurar lo anterior, no estaba funcionando. Al final resultó que también tengo que permitir encabezados de control de caché.

filter.setInitParameter("allowedHeaders", "Cache-Control,If-Modified-Since,Pragma,Content-Type,Authorization,X-Requested-With,Content-Length,Accept,Origin");