2016-10-07 11 views
4

Angular 2のPathLocationHandlerを組み込みJettyサーバーでサポートする方法を試しています。私はそれを理解し、それをするために、私はAngty 2のPathLocationHandlerとJettyのサポート(404エラーページを使用)

https://stackoverflow.com/a/34104534/797)トップレベルのindex.htmlファイルに任意の404の要求をリダイレクトする必要があり、私はそれを行うための方法は、すべての404リダイレクトのContextHandlerとのErrorHandlerを与えることだった考え出し以下のようなコードで/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(); 
    } 

} 

、私が見ることResourceHandlerはresourceBaseだし、その後...

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

呼び出し、それに一致するファイルが見つからないということです。その後、我々はContextHandlerからバブルアップし、最終的にHttpChannelOverHttpは要求が処理されたと見なされないため404を送信します。

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

おそらく、Jettyは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>