Forse in molti avranno sentito parlare di Cross Origin Resource Sharing (CORS). Un caso estremamente comune per le applicazioni web è quello del reperimento dei dati mediante un web service di tipo REST, la nostra applicazione quindi andrà a reperire i dati da mostrare attraverso un servizio esposto.

Purtroppo, per limitare l’eventualità di attacchi informatici, i browser moderni applicano la restrizione same-origin; senza entrare in dettagli, un’applicazione web su un dominio A non riuscirà a chiamare il servizio REST esposto su un dominio B.

In Java, esistono vari modi per aggirare tale restrizione, una semplicissima consiste nello scrivere una classe CORSFilter che, come dice il nome stesso, è un filtro CORS personalizzato:

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CORSFilter implements Filter {
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		HttpServletRequest req = (HttpServletRequest) request;
 
        // Autorizza tutti i domini a consumare il servizio
        ((HttpServletResponse) response).addHeader("Access-Control-Allow-Origin", "*");
        ((HttpServletResponse) response).addHeader("Access-Control-Allow-Methods", "GET, OPTIONS, HEAD, PUT, POST, DELETE");
        ((HttpServletResponse) response).addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
 
        HttpServletResponse resp = (HttpServletResponse) response;
 
        if (req.getMethod().equals("OPTIONS")) {
            resp.setStatus(HttpServletResponse.SC_ACCEPTED);
            return;
        }
 
        chain.doFilter(request, response);
		
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

}

Per poi registrarla come filtro nel web.xml:

<filter>
    <filter-name>CorsFilter</filter-name>
    <filter-class>nomedelpackage.CORSFilter</filter-class>
</filter>
 
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Da ricordare che le righe qui sopra vanno inserite prima del tag <servlet>.

Tutto qui.. Adesso il filtro CORS funziona a dovere.

Alla prossima..

Share
Molto scarsoScarsoSufficienteBuonoOttimo (Nessun voto)
Loading...

Licenza

Creative Commons License
RedBlue's Blog di RedBlue è rilasciato sotto licenza Creative Commons 2.5 Italia.

Badges

Cionfs'Forum CMS Check PageRank

Other

Se hai trovato utile questo blog, supportalo con una piccola donazione per l'hosting..


Locations of visitors to this page