Enabling CORS in Micronaut using Filters

Enabling CORS in Micronaut using Filters

For a beginner CORS is a cross site resource sharing, Means when the request is sent from a browser, communication should happen with in the same domain. But now we are disturbing almost everything in this era, So there is always a chance that we might Host JS in one server and Backend in another. Or during  the development, JS code might run on different port/virtual host, During these scenario We get CORS error. there are multiple ways to Handel CORS. Either by using reverse Proxy server, or by enabling the  CORS in within the server. There is one line Configuration to do that in micronut by using :

micronaut:
    server:
        cors:
            enabled: true

But  I am taking programmatic approach, and add small snippet of code which documents the concept of the filter, as this could be repurposed to anything like adding activity id for the request, and custom headers for all the response, or log both request and response. So now Lets dive into the Code snippet.

@Filter(value = "/**")
public class CorsAdvice  implements HttpServerFilter {


    @Override
    public Publisher<MutableHttpResponse<?>> doFilter(HttpRequest<?> request, ServerFilterChain chain) {
        return Flowable.fromCallable(() -> {
            return true;
        }).subscribeOn(Schedulers.io()).switchMap(a -> chain.proceed(request)).doOnNext(res -> {
            res.getHeaders().add("Access-Control-Allow-Credentials","true");
            res.getHeaders().add("Access-Control-Allow-Methods","*");
            res.getHeaders().add("Access-Control-Allow-Origin","*");
            res.getHeaders().add("Access-Control-Allow-Headers","*");
        });
    }
}

Basically this uses http serverless filter to intercept the both request and response, we need to override the doFilter method to write our custom logic.

Do Filter method takes Http request , and ServerFliterChain as request, So to implement our logic we need to use RXJava Observable method  to subscribe. from callable method implement the preprocess logic if required, and  on Do next we can implement  Post process logic, in my example adding CORS headers.