Pages

mardi 18 mars 2014

Spring 4.0 et gestion du Cross-origin resource sharing via Javaconfig

Suite à des commentaires récents sur mon blog je vais compléter mes articles sur le Cross-origin resource sharing (CORS) : implémenter son propre filter, utiliser le CorsFilter d'Apache. Nous allons voir comment paramétrer une application Spring 4.0.2 via JavaConfig (Serlet 3.0) pour utiliser le CorsFilter d'Apache.



Vous devez écrire un Filter pour spécifier les données attendues dans le header HTTP

@Component
public class SimpleCORSFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
        filterChain.doFilter(servletRequest, response);

    }

    @Override
    public void destroy() { }
}


Au niveau de la configuration de la webapp dans Spring il faut ajouter la déclaration d'un filter.

public class WebAppInitializer extends   AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
       return new Class<?>[] { PersistenceConfig.class, ServiceConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebMvcConfiguration.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

    @Override
    protected Filter[] getServletFilters() {
        return new Filter[]{new SimpleCORSFilter()};
    }
}

Cet exemple est assez simple et je vais maintenant montrer comment s'interfacer avec le filter fourni par Apache Tomcat. Pour celà la première étape consiste à importer la dépendance dans votre projet. Si vous utilisez Maven vous devez ajouter dans votre pom la dépendance suivante (pensez au scope provided pour ne que la librairie ne soit pas incluse dans votre livrable)

<dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-catalina</artifactId>
            <version>7.0.41</version>
            <scope>provided</scope>
</dependency>

Au niveau de la classe de configuration du contexte de la webapp, vous pourrer utiliser
    @Override
    protected Filter[] getServletFilters() {
        return new Filter[]{new CorsFilter()};
    }
Par contre si vous voulez personnaliser les paramètres du filter (voir la doc Apache) vous devrez passer par le fichier web.xml

2 commentaires:

  1. Pourquoi une dépendance sur org.apache.tomcat:tomcat-catalina ? Une dépendance sur l'API servlet (plus portable) n'aurait pas suffit pour ton exemple ?

    RépondreSupprimer
    Réponses
    1. Merci Alexis pour ton commentaire. J'ai vu qu'il manquait la fin de l'article et au niveau de la dépendance elle n'est nécessaire que si tu veux utiliser le org.apache.catalina.filters.CorsFilter.

      Supprimer

Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.