2014-12-05 3 views
2

부두 9를 사용하고 구성에 몇 가지 문제가 있습니다. 나는 간단한 REST가 잘 작동한다. 하지만 문제는 모든 요청과 오류 처리기에 새 헤더를 추가하려고 할 때 시작되었습니다.부두 서버 구성

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

Jersey 1.x와 Jersey 2.x가 혼합되어 있습니다 (이 아니어야 함). 필터 클래스는 Jersey 1.x를 기반으로합니다. ResourceConfig은 Jersey 2.x입니다. Jersey 1.x ResourceConfig에는 register() 메소드가 없기 때문에 이것을 알고 있습니다. Jersey 1.x에서는 위의 필터를 등록하는 방법이 있습니다.

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

그리고 그 정도면 충분합니다. 그러나 Jersey 2.x에는 필터를 추가하는 방법이 없습니다. 우리는 모든 것을 register해야합니다.

Jersey 2.x를 사용하고 있다면 Jersey 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

:

그래서 사용자 정의 필터를 추가 나는 같은 jetty.xml의 파일을 등록했다 작동하지 않습니까? – gouessej

0

언급 한 peeskillet과 비슷한 접근 방식이지만 제 응용 프로그램에서는 jetty.xml에 jetty 구성이 있습니다. 액세스 제어 - 허용 - 원산지에 대한 *하는 사용하는 경우가 아닌가

<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>