Разработка
Разрабатывали систему Виджетов для нашего сервиса, которые должны устанавливаться на "чужие" сервера, обращаться к нашему сервису, а потом строить графики, отчёты. После выпуска релиза оказалось, что мы при тестировании пропустили кросс-доменное (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>