Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Enabling cors in dropwizard not working

Tags:

I'm working on a dropwizard application and js ui to interacte with the api. I need to load json data to update views but I have to enable cors in dropwizard before that. I did some staff but it seems not working because dropwizard returns allways 204 no content.

@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); } 
like image 809
naslami Avatar asked Sep 10 '14 21:09

naslami


People also ask

How do I enable CORS in REST API?

Enable CORS support on a REST API resource Sign in to the API Gateway console at https://console.aws.amazon.com/apigateway . Choose the API from the APIs list. Choose a resource under Resources. This will enable CORS for all the methods on the resource.

How do I enable CORS globally?

Scope Rules for [EnableCors] You can enable CORS per action, per controller, or globally for all Web API controllers in your application. To enable CORS for a single action, set the [EnableCors] attribute on the action method. The following example enables CORS for the GetItem method only.

Is CORS enabled by default?

CORS is off by default for security purposes.


2 Answers

The bug here is that the filter hasn't been configured with a URL path via the addMappingForUrlPatterns method.

This worked for me using 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, "/*"); } 

I'm assuming you're testing this live in a browser, but you can verify via CLI with a curl command like this:

$ 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 

You should see a bunch of Access-Control-* HTTP headers in the response.

like image 136
Mike Clarke Avatar answered Nov 07 '22 03:11

Mike Clarke


Adding to Mike Clarke's answer:

Setting the CHAIN_PREFLIGHT_PARAM to false will let this filter handle preflight requests without your authentication filters intercepting what would be a 200 response and turning them into unauthorized / forbidden.

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

I was surprised that I didn't find any examples on the interwebs that included this configuration. Spent a few days trying to figure this out.

like image 45
Jimi Avatar answered Nov 07 '22 03:11

Jimi