2016-10-07 3 views
4

임베디드 Jetty 서버로 Angular 2의 PathLocationHandler를 지원하는 방법을 연구 중입니다. 이를 이해하기 위해 404 요청을 최상위 수준의 index.html 파일 (https://stackoverflow.com/a/34104534/797)Angty 2의 PathLocationHandler with Jetty (404 오류 페이지 사용)

으로 리디렉션해야합니다.이 작업을 수행하는 방법은 ContextHandler와 ErrorHandler가 모두 404를 리디렉션하도록하는 것입니다. 아래의 코드와 같이 /index.html에 다시 요청합니다 (사실 컨텍스트 XML 파일에서이 작업을 수행하고 있지만 개념적으로/디버그하기가 쉽습니다).

내가 보는 것은 내 오류 처리기가 완전히 무시된다는 것이며 그 문제를 해결하는 방법이나 대안으로 구성해야하는 방법을 잘 모르겠습니다. http://localhost:8080/context-path/some-file-which-is-not-present.html 같은 요청에 대한 부두 코드를 통해 스테핑


import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.server.handler.ContextHandler; 
import org.eclipse.jetty.server.handler.ResourceHandler; 
import org.eclipse.jetty.servlet.ErrorPageErrorHandler; 

public class JettyTest { 

    public static void main(String[] args) throws Exception { 
     Server server = new Server(8080); 

     ResourceHandler resourceHandler = new ResourceHandler(); 
     resourceHandler.setResourceBase("/tmp/directory-with-just-an-index.html-file"); 

     ContextHandler contextHandler = new ContextHandler("/context-path"); 

     ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler(); 
     errorHandler.addErrorPage(404, "/index.html"); 

     contextHandler.setHandler(resourceHandler); 
     contextHandler.setErrorHandler(errorHandler); 

     server.setHandler(contextHandler); 

     server.start(); 
     System.out.println("Started!"); 
     server.join(); 
    } 

} 

는, 내가 볼 것은 ... 그것은 resourceBase, 그리고 다음 호출의 ResourceHandler이 일치하는 파일을 찾아 없다고

//no resource - try other handlers 
    super.handle(target, baseRequest, request, response); 
    return; 

입니다. .. 우리는 ContextHandler를 버블 링하고 결국 HttpChannelOverHttp는 요청이 처리 된 것으로 간주되지 않기 때문에 404를 보냅니다.

if (!_response.isCommitted() && !_request.isHandled()) 
     _response.sendError(404); 

아마도 부두에서는 ResourceHandler가 404 오류를 다른 방법으로 알리 길 기대하고 있습니까? 아니면 내가 물건을 구성하는 방식으로 뭔가를 설명하지 못할 수도 있습니다.

잘못된 구성 힌트는 ResourceHandler "존재하지 않는 리소스에 대한 요청이 전달됩니다 (예 : 404가 아닙니다)."에 대한 언급이있을 수 있지만 그 다음에 '자신의 처리기 작성'이외에 어디로 가야할지 명확하지 않습니다. '나는 피하는 것을 선호한다.

모든 포인터가 많이 감사합니다!

답변

2

내 머리를 두드리는 것에서 나는 다음과 같은 것을 보았습니다. 나는 ResourceHandler가 내가 원하는 것에 적절하지 않은 이유를 설명하는 대답을 확실히 받아 들일 수 있지만, 내가 원하는 것을합니다.

import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.servlet.DefaultServlet; 
import org.eclipse.jetty.servlet.ErrorPageErrorHandler; 
import org.eclipse.jetty.servlet.ServletContextHandler; 
import org.eclipse.jetty.servlet.ServletHolder; 

public class JettyTest { 

    public static void main(String[] args) throws Exception { 
     Server server = new Server(8080); 

     ServletContextHandler servletContextHandler = new ServletContextHandler(); 
     servletContextHandler.setContextPath("/context-path"); 
     servletContextHandler.setResourceBase("/tmp/directory-with-just-an-index.html-file"); 
     servletContextHandler.addServlet(new ServletHolder(new DefaultServlet()), "/*"); 

     ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler(); 
     errorHandler.addErrorPage(404, "/index.html"); 

     servletContextHandler.setErrorHandler(errorHandler); 

     server.setHandler(servletContextHandler); 

     server.start(); 
     System.out.println("Started!"); 
     server.join(); 
    } 

} 

... 이제 다시는 XML 컨텍스트 파일에 설정하려고합니다 :)


을 ... 나는 결국 경우 사람이 나중에 필요에은 다음과 않았다.

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"> 

<Configure class="org.eclipse.jetty.servlet.ServletContextHandler" id="myContext"> 

    <Set name="contextPath">/context-path</Set> 
    <Set name="resourceBase">/tmp/directory-with-just-an-index.html-file</Set> 

    <!-- Direct all 404s to index.html (required by Angular's PathLocationStrategy) --> 
    <Set name="errorHandler"> 
     <New class="org.eclipse.jetty.servlet.ErrorPageErrorHandler"> 
      <Call name="addErrorPage"> 
       <Arg type="int">404</Arg> 
       <Arg type="String">/index.html</Arg> 
      </Call> 
     </New> 
    </Set> 

    <Call name="addServlet"> 
     <Arg><New class="org.eclipse.jetty.servlet.ServletHolder"> 
      <Arg> 
       <New class="org.eclipse.jetty.servlet.DefaultServlet"></New> 
      </Arg> 
     </New></Arg> 
     <Arg>/*</Arg> 
    </Call> 

</Configure>