Ответ 1
Делать с конкретными требованиями моего приложения. Сервер должен быть полностью отделен от клиента. Клиент должен иметь возможность подключаться к коммуникационному серверу любым доступным способом.
Поскольку первая реализация этого приложения будет основана на REST, мне нужно иметь возможность принимать отдых из любого места.
Кроме того, я хочу полностью xml-конфигурацию, поэтому я использую Guice со встроенным сервером Jetty. Поскольку у меня нет файла web.xml, я не мог понять, как установить заголовки для разрешения CORS.
После долгих проб и ошибок и прочтения документации-подсказки я обнаружил, как добавить заголовки CORS к ответу, покидая сервер.
Класс Guice ServletModule позволяет вам добавлять фильтры в ваш контекст сервлета. Это позволяет мне передавать все запросы через данный сервлет.
Так как я пытаюсь создать приложение отдыха, которое отвечает на запросы CORS, мне нужен фильтр, который добавляет заголовки cors к ответу на любой запрос.
Поэтому, чтобы включить cors на моем встроенном сервере, используя guice, я создал фильтр, который выглядит следующим образом:
@Singleton
public class CorsFilter implements Filter{
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
if(response instanceof HttpServletResponse){
HttpServletResponse alteredResponse = ((HttpServletResponse)response);
addCorsHeader(alteredResponse);
}
filterChain.doFilter(request, response);
}
private void addCorsHeader(HttpServletResponse response){
//TODO: externalize the Allow-Origin
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, HEAD");
response.addHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept");
response.addHeader("Access-Control-Max-Age", "1728000");
}
@Override
public void destroy() {}
@Override
public void init(FilterConfig filterConfig)throws ServletException{}
}
Guice предоставляет абстрактный класс, который позволяет настраивать сервлет Guice.
Модуль конфигурации выглядит следующим образом:
public class RestModule extends ServletModule{
@Override
protected void configureServlets() {
bind(MyServiceClass.class);
// hook Jersey into Guice Servlet
bind(GuiceContainer.class);
// hook Jackson into Jersey as the POJO <-> JSON mapper
bind(JacksonJsonProvider.class).in(Scopes.SINGLETON);
Map<String, String> guiceContainerConfig = new HashMap<String, String>();
serve("/*").with(GuiceContainer.class, guiceContainerConfig);
filter("/*").through(CorsFilter.class);
}
}
Теперь guice будет добавлять заголовки cors к каждому ответу. Позволяет моему чистому приложению HTML 5 общаться с ним независимо от того, где оно обслуживается.