2014-12-05 7 views
2

Я использую Jetty 9 и имею некоторые проблемы с конфигурацией. Я просто ОТДЫХ работает отлично. Но проблема началась, когда я попытался добавить новые заголовки ко всем запросам и обработчикам ошибок. Только так я могу обрабатывать заголовки это путем добавления этого кода в каждый ответ:Конфигурация сервера Jetty

return Response.ok(murals) 
       .header("Access-Control-Allow-Origin", "*") 
       .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT") 
       .build(); 

Конфигурация сервера:

 Server server = new Server(9998); 
     ServletContextHandler servletContextHandler = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS); 

     servletContextHandler.addFilter(GuiceFilter.class, "/*", EnumSet.allOf(DispatcherType.class)); 
     servletContextHandler.addServlet(DefaultServlet.class, "/"); 

     ResourceConfig rc = new ResourceConfig() 
       .register(FilterHeaders.class) 
       .register(ExceptionNotFound.class) 
       .register(CORSFilter.class); //doesnt work 
     new ServletHolder(new ServletContainer(rc)); 

     HandlerWrapper han = new HandlerWrapper(); 
     han.setHandler(new AbstractHandler() { 

      @Override 
      public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 
       request.setAttribute("welcome","Hello"); //doesn't work 
      } 
     }); 

     servletContextHandler.addFilter(Filters.class, "/*", EnumSet.of(DispatcherType.REQUEST)); //doesnt work 

     ResourceHandler resourceHandler = resourceHandler(); 
     servletContextHandler.setHandler(resourceHandler); 
     servletContextHandler.setHandler(han); 
     server.start(); 
     server.join(); 

CROSFilter класс

public class CORSFilter implements ContainerResponseFilter { 

     @Override 
     public ContainerResponse filter(ContainerRequest request, 
       ContainerResponse response) { 

      response.getHttpHeaders().add("Access-Control-Allow-Origin", "*"); 
      response.getHttpHeaders().add("Access-Control-Allow-Headers", 
        "origin, content-type, accept, authorization"); 
      response.getHttpHeaders().add("Access-Control-Allow-Credentials", "true"); 
      response.getHttpHeaders().add("Access-Control-Allow-Methods", 
        "GET, POST, PUT, DELETE, OPTIONS, HEAD"); 

      return response; 
     } 

    } 

Как зарегистрировать заголовки? Что я делаю не так? Я не использую конфигурацию WEB.

ответ

3

Вы смешиваете Джерси 1.x с Джерси 2.x, которая должна не быть сделано. Ваш класс фильтров основан на Jersey 1.x. Ваш ResourceConfig - Джерси 2.x. Я знаю это, потому что у Джерси 1.x ResourceConfig нет метода register(). С Джерси 1.x, это будет зарегистрировать ваш фильтр выше

resourceConfig.getContainerResponseFilters().add(new CORSFilter()); 

И этого будет достаточно. Но у Джерси 2.x нет такого способа добавления фильтров. Нам нужно register все.

Это, если вы используете Джерси 2.x, я настоятельно рекомендую избавиться от всех ваших зависимостей от Джерси 1.x. После этого первое, что вы заметите, это то, что ваш класс фильтра больше не будет компилироваться. Вот как должен выглядеть рефакторизованный фильтр 2.x:

import java.io.IOException; 
import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerResponseContext; 
import javax.ws.rs.container.ContainerResponseFilter; 

@Provider 
public class CORSFilter implements ContainerResponseFilter { 

    @Override 
    public void filter(ContainerRequestContext request, 
      ContainerResponseContext response) throws IOException { 
     response.getHeaders().add("Access-Control-Allow-Origin", "*"); 
     response.getHeaders().add("Access-Control-Allow-Headers", 
       "origin, content-type, accept, authorization"); 
     response.getHeaders().add("Access-Control-Allow-Credentials", "true"); 
     response.getHeaders().add("Access-Control-Allow-Methods", 
       "GET, POST, PUT, DELETE, OPTIONS, HEAD"); 
    } 
} 

Использование вышеуказанного фильтра должно работать.

+0

не Есть ли случаи, в которых с помощью * для Access-Control-Allow-Origin не будет работать? – gouessej

0

Аналогичный подход, как упомянуто peeskillet, но я использовал конфигурацию причала в jetty.xml в своем приложении.

Так, чтобы добавить пользовательские фильтры я должен зарегистрировать их в файле jetty.xml как:

<New class="org.eclipse.jetty.servlet.ServletHolder"> 
<Arg> 
    <New class="com.sun.jersey.spi.container.servlet.ServletContainer"> 
     <Arg> 
      <New class="com.sun.jersey.api.core.PackagesResourceConfig"> 
       <Arg> 
        <Map> 
         <Entry> 
         <Item>com.sun.jersey.config.property.packages</Item> 
         <Item>...my package</Item> 
         </Entry> 
         <Entry> 
         <Item>com.sun.jersey.spi.container.ContainerResponseFilters</Item> 
         <Item>...MyCorsResponseFilter</Item> 
         </Entry> 
        </Map> 
       </Arg> 
      </New> 
     </Arg> 
    </New> 
</Arg> 

Смежные вопросы