Разработка

Cross-domain ajax на Java сервере

Разрабатывали систему Виджетов для нашего сервиса, которые должны устанавливаться на "чужие" сервера, обращаться к нашему сервису, а потом строить графики, отчёты. После выпуска релиза оказалось, что мы при тестировании пропустили кросс-доменное (Cross-domain) тестирование. И у нас выскочила ошибка вида

 XMLHttpRequest Origin null is not allowed Access-Control-Allow-Origin for file: ...

Решение этой проблемы в том, что в ответ, который возвращает сервер надо вставить заголовок:

Access-Control-Allow-Origin = *

Т.к. сервис написан на Java и работает под управлением сервера Tomcat, то самым простым вариант решения такой проблемы мне видится вариант написания фильтра, который подставляет нужные заголовки при запросе на нужные URL.

Код фильтра:

public class HeaderFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", request.getHeader("Access-Control-Request-Methods"));
        response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));
        response.setHeader("Access-Control-Max-Age", "86400");

        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        //To change body of implemented methods use File | Settings | File Templates.
    }
}

Настройка web.xml для сервера Tomcat

<web-app>
    ...
    <filter>
        <filter-name>headFilter</filter-name>
        <filter-class>
            com.iqmen.web.filter.HeaderFilter
        </filter-class>
    </filter>
    ...
    <filter-mapping>
        <filter-name>headFilter</filter-name>
        <url-pattern>/actions/jswidget</url-pattern>
    </filter-mapping>
    ...
</web-app>